복합 키를 만들 때 구문 오류를 이해할 수 없습니다. 여러 종류를 테스트했기 때문에 논리 오류 일 수 있습니다.
Postgres에서 복합 키를 어떻게 생성합니까?
CREATE TABLE tags
(
(question_id, tag_id) NOT NULL,
question_id INTEGER NOT NULL,
tag_id SERIAL NOT NULL,
tag1 VARCHAR(20),
tag2 VARCHAR(20),
tag3 VARCHAR(20),
PRIMARY KEY(question_id, tag_id),
CONSTRAINT no_duplicate_tag UNIQUE (question_id, tag_id)
);
ERROR: syntax error at or near "("
LINE 3: (question_id, tag_id) NOT NULL,
^
답변
화합물 PRIMARY KEY
사양은 이미 원하는 것을 수행합니다. 구문 오류를 제공하는 줄을 생략하고 중복 CONSTRAINT
(이미 암시)도 생략합니다 .
CREATE TABLE tags
(
question_id INTEGER NOT NULL,
tag_id SERIAL NOT NULL,
tag1 VARCHAR(20),
tag2 VARCHAR(20),
tag3 VARCHAR(20),
PRIMARY KEY(question_id, tag_id)
);
NOTICE: CREATE TABLE will create implicit sequence "tags_tag_id_seq" for serial column "tags.tag_id"
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "tags_pkey" for table "tags"
CREATE TABLE
pg=> \d tags
Table "public.tags"
Column | Type | Modifiers
-------------+-----------------------+-------------------------------------------------------
question_id | integer | not null
tag_id | integer | not null default nextval('tags_tag_id_seq'::regclass)
tag1 | character varying(20) |
tag2 | character varying(20) |
tag3 | character varying(20) |
Indexes:
"tags_pkey" PRIMARY KEY, btree (question_id, tag_id)
답변
당신이 얻는 오류는 줄 3에 있습니다.
CONSTRAINT no_duplicate_tag UNIQUE (question_id, tag_id)
그러나 이전 :
CREATE TABLE tags
(
(question_id, tag_id) NOT NULL,
올바른 테이블 정의는 pilcrow가 보여준 것과 같습니다.
그리고 tag1, tag2, tag3 (매우 의심스러운 소리)에 고유 한 항목을 추가하려는 경우 구문은 다음과 같습니다.
CREATE TABLE tags (
question_id INTEGER NOT NULL,
tag_id SERIAL NOT NULL,
tag1 VARCHAR(20),
tag2 VARCHAR(20),
tag3 VARCHAR(20),
PRIMARY KEY(question_id, tag_id),
UNIQUE (tag1, tag2, tag3)
);
또는 원하는대로 제약 조건 이름을 지정하려는 경우 :
CREATE TABLE tags (
question_id INTEGER NOT NULL,
tag_id SERIAL NOT NULL,
tag1 VARCHAR(20),
tag2 VARCHAR(20),
tag3 VARCHAR(20),
PRIMARY KEY(question_id, tag_id),
CONSTRAINT some_name UNIQUE (tag1, tag2, tag3)
);