중첩을 사용하여 삽입된 SQL?

질문:

나는 postgreSQL 채팅 로그를 저장하는데 다음과 같은 예시 모드가 있다.
CREATE TABLE contacts (
  "id" BIGSERIAL PRIMARY KEY,
  "user" BIGINT NOT NULL,
  "contact" BIGINT NOT NULL,
  "savedAs" VARCHAR(36),
  CONSTRAINT user_fk FOREIGN KEY("user") REFERENCES users("id") ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT contact_fk FOREIGN KEY("contact") REFERENCES users("id") ON DELETE CASCADE ON UPDATE CASCADE,
  UNIQUE("user", "contact")
);

CREATE TABLE messages (
  "id" BIGSERIAL PRIMARY KEY,
  "contact" BIGINT NOT NULL,
  "direction" direction_type NOT NULL,
  "type" message_type default 'text',
  "body" VARCHAR(1000) NULL,
  "status" status_type DEFAULT 'none',
  "time" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
  CONSTRAINT contact_fk FOREIGN KEY("contact") REFERENCES contacts("id") ON DELETE CASCADE
);

CREATE TABLE last_message (
  "id" BIGSERIAL PRIMARY KEY,
  "chat" BIGINT NOT NULL UNIQUE,
  "message" BIGINT NOT NULL,
  CONSTRAINT message_fk FOREIGN KEY("message") REFERENCES messages("id"),
  CONSTRAINT chat_fk FOREIGN KEY("chat") REFERENCES contacts("id") ON DELETE CASCADE
);
내가 하고 싶은 것은 특정한 채팅의 마지막 메시지를 last_message표에 저장하는 것이다.나는 이렇게 하고 싶다(하지만 일하지 않는다):
 INSERT INTO last_message (chat, message) VALUES (
     9,
     (INSERT INTO messages (contact, direction, body) VALUES (9, 'sent', 'hello there') RETURNING id)
 )
하지만 문법 오류syntax error at or near "into"를 얻었습니다. 다음은 제 문제입니다.
  • 상술한 조회에 무슨 문제가 있습니까?
  • 더 좋은 방법이 있나요?어때요?
  • 개선할 만한 것이 있습니까?
  • 답안

    CTE 사용:
    WITH toinsert as (
          INSERT INTO messages (contact, direction, body)
              VALUES (9, 'sent', 'hello there')
              RETURNING id
         )
    INSERT INTO last_message (chat, message) 
        SELECT 9, id
        FROM toinsert;