vistas tipos funciones español ejemplos desde descargar datos consultas comandos cero aprender sql postgresql composite-key

sql - tipos - Postgres: ¿Cómo hacer teclas compuestas?



postgresql pdf (2)

El error que está recibiendo está en la línea 3. es decir, no está en

CONSTRAINT no_duplicate_tag UNIQUE (question_id, tag_id)

pero antes:

CREATE TABLE tags ( (question_id, tag_id) NOT NULL,

No tengo ni idea de por qué lo colocó allí. ¿Cuál es el propósito? ¿Cuál es la lógica?

De todas formas. La definición correcta de la tabla es como pilcrow mostró.

Y si desea agregar unique en tag1, tag2, tag3 (que suena muy sospechoso), entonces la sintaxis es:

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) );

o, si desea tener la restricción nombrada de acuerdo con su deseo:

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) );

No puedo entender el error de sintaxis al crear una clave compuesta. Puede ser un error lógico, porque he probado muchas variedades.

¿Cómo se crean claves compuestas en 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, ^


Su especificación PRIMARY KEY compuesta ya hace lo que quiere. Omita la línea que le da un error de sintaxis, y omita la CONSTRAINT redundante (ya implícita), también:

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)