Postgres: Wie Composite-Tasten zu tun?
-
18-09-2019 - |
Frage
Ich kann den Syntaxfehler versteht einen zusammengesetzten Schlüssel zu schaffen. Es kann ein logischer Fehler, weil ich viele Sorten getestet haben.
Wie erstellen Sie zusammengesetzte Schlüssel in 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,
^
Lösung
Ihre Verbindung PRIMARY KEY
Spezifikation bereits tut, was Sie wollen. Lassen Sie die Zeile, die Ihnen einen Syntaxfehler, und lassen Sie den redundanten CONSTRAINT
(bereits angedeutet) sind zu geben, auch:
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)
Andere Tipps
Der Fehler, den Sie bekommen ist in Zeile 3 das heißt, es ist nicht in
CONSTRAINT no_duplicate_tag UNIQUE (question_id, tag_id)
aber früher:
CREATE TABLE tags
(
(question_id, tag_id) NOT NULL,
Die korrekte Tabellendefinition ist wie Pilcrow zeigte.
Und wenn Sie auf tag1 einzigartig hinzufügen möchten, tag2, tag3 (was sehr verdächtig klingt), dann ist die Syntax:
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)
);
oder, wenn Sie die Einschränkung nach Ihrem Wunsch benannt haben:
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)
);