Pregunta

Nunca he "codificadas a mano" creación de objetos de código de SQL Server y la clave externa decleration es aparentemente diferentes entre SQL Server y Postgresql.Aquí está mi sql hasta el momento:

drop table exams;
drop table question_bank;
drop table anwser_bank;

create table exams
(
    exam_id uniqueidentifier primary key,
    exam_name varchar(50),
);
create table question_bank
(
    question_id uniqueidentifier primary key,
    question_exam_id uniqueidentifier not null,
    question_text varchar(1024) not null,
    question_point_value decimal,
    constraint question_exam_id foreign key references exams(exam_id)
);
create table anwser_bank
(
    anwser_id           uniqueidentifier primary key,
    anwser_question_id  uniqueidentifier,
    anwser_text         varchar(1024),
    anwser_is_correct   bit
);

Al ejecutar la consulta me sale este error:

Msg 8139, Nivel 16, Estado 0, Línea 9 Número de referencias a columnas de clave externa difiere del número de hace referencia a columnas de la tabla 'question_bank'.

Puede detectar el error?

¿Fue útil?

Solución

create table question_bank
(
    question_id uniqueidentifier primary key,
    question_exam_id uniqueidentifier not null,
    question_text varchar(1024) not null,
    question_point_value decimal,
    constraint fk_questionbank_exams foreign key (question_exam_id) references exams (exam_id)
);

Otros consejos

Y si lo que desea es crear la restricción en su propio, usted puede usar ALTER TABLE

alter table MyTable
add constraint MyTable_MyColumn_FK FOREIGN KEY ( MyColumn ) references MyOtherTable(PKColumn)

Yo no recomendaría la sintaxis mencionada por Sara Chipps en línea para la creación, sólo porque prefiero nombre de mis propias limitaciones.

También puede nombrar a su restricción de clave externa mediante:

CONSTRAINT your_name_here FOREIGN KEY (question_exam_id) REFERENCES EXAMS (exam_id)

Me gusta AlexCuse la respuesta, pero algo que usted debe prestar atención a cada vez que agregue una restricción de clave externa es cómo usted desea que las actualizaciones de la referencia a la columna en una fila de la tabla de referencia para ser tratados, y, especialmente, de cómo usted quiere que elimina de filas en la tabla de referencia para ser tratados.

Si una restricción es creado como este:

alter table MyTable
add constraint MyTable_MyColumn_FK FOREIGN KEY ( MyColumn ) 
references MyOtherTable(PKColumn)

..entonces las actualizaciones o eliminaciones en la tabla de referencia para estallar con un error si no hay una fila correspondiente en la tabla de referencia.

Que podría ser el comportamiento que usted quiere que, pero en mi experiencia, es mucho más comunmente no lo es.

Si, en lugar de crear algo como esto:

alter table MyTable
add constraint MyTable_MyColumn_FK FOREIGN KEY ( MyColumn ) 
references MyOtherTable(PKColumn)
on update cascade 
on delete cascade

..a continuación, las actualizaciones y eliminaciones en la tabla primaria tendrá como resultado de las actualizaciones y eliminaciones de las filas correspondientes de la tabla de referencia.

(No estoy sugiriendo que debe cambiar el valor predeterminado, el valor predeterminado yerra en el lado de la precaución, lo cual es bueno.Solo estoy diciendo que es algo que una persona que es la creación de restricciones siempre debe prestar atención a.)

Esto puede hacerse, por cierto, a la hora de crear una tabla como esta:

create table ProductCategories (
  Id           int identity primary key,
  ProductId    int references Products(Id)
               on update cascade on delete cascade
  CategoryId   int references Categories(Id) 
               on update cascade on delete cascade
)
create table question_bank
(
    question_id uniqueidentifier primary key,
    question_exam_id uniqueidentifier not null constraint fk_exam_id foreign key references exams(exam_id),
    question_text varchar(1024) not null,
    question_point_value decimal
);

--Que trabajar demasiado.Pehaps un poco más intuitivo construir?

Si desea crear dos columnas de la tabla en una relación mediante una consulta tratar el siguiente:

Alter table Foreign_Key_Table_name add constraint 
Foreign_Key_Table_name_Columnname_FK
Foreign Key (Column_name) references 
Another_Table_name(Another_Table_Column_name)

Para Crear una clave foránea en una tabla

ALTER TABLE [SCHEMA].[TABLENAME] ADD FOREIGN KEY (COLUMNNAME) REFERENCES [TABLENAME](COLUMNNAME)
EXAMPLE
ALTER TABLE [dbo].[UserMaster] ADD FOREIGN KEY (City_Id) REFERENCES [dbo].[CityMaster](City_Id)

Como tú, no me suelen crear claves foráneas a mano, pero si por alguna razón necesito el script para hacerlo yo suelo crear utilizando ms sql server management studio y antes de guardar los cambios, seleccione la Tabla de Diseñador | a Generar el Cambio de secuencia de Comandos

Este script es acerca de la creación de tablas con clave foránea y he añadido restricción de integridad referencial sql-server.

create table exams
(  
    exam_id int primary key,
    exam_name varchar(50),
);

create table question_bank 
(
    question_id int primary key,
    question_exam_id int not null,
    question_text varchar(1024) not null,
    question_point_value decimal,
    constraint question_exam_id_fk
       foreign key references exams(exam_id)
               ON DELETE CASCADE
);

Necromancing.
En realidad, hacer esto correctamente es un poco más complicado.

Primero tiene que comprobar si la clave principal existe para la columna que desea establecer su clave foránea que referencia.

En este ejemplo, una clave externa en la tabla T_ZO_SYS_Language_Forms se crea, haciendo referencia a dbo.T_SYS_Language_Forms.LANG_UID

-- First, chech if the table exists...
IF 0 < (
    SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES 
    WHERE TABLE_TYPE = 'BASE TABLE'
    AND TABLE_SCHEMA = 'dbo'
    AND TABLE_NAME = 'T_SYS_Language_Forms'
)
BEGIN
    -- Check for NULL values in the primary-key column
    IF 0 = (SELECT COUNT(*) FROM T_SYS_Language_Forms WHERE LANG_UID IS NULL)
    BEGIN
        ALTER TABLE T_SYS_Language_Forms ALTER COLUMN LANG_UID uniqueidentifier NOT NULL 

        -- No, don't drop, FK references might already exist...
        -- Drop PK if exists 
        -- ALTER TABLE T_SYS_Language_Forms DROP CONSTRAINT pk_constraint_name 
        --DECLARE @pkDropCommand nvarchar(1000) 
        --SET @pkDropCommand = N'ALTER TABLE T_SYS_Language_Forms DROP CONSTRAINT ' + QUOTENAME((SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
        --WHERE CONSTRAINT_TYPE = 'PRIMARY KEY' 
        --AND TABLE_SCHEMA = 'dbo' 
        --AND TABLE_NAME = 'T_SYS_Language_Forms' 
        ----AND CONSTRAINT_NAME = 'PK_T_SYS_Language_Forms' 
        --))
        ---- PRINT @pkDropCommand 
        --EXECUTE(@pkDropCommand) 

        -- Instead do
        -- EXEC sp_rename 'dbo.T_SYS_Language_Forms.PK_T_SYS_Language_Forms1234565', 'PK_T_SYS_Language_Forms';


        -- Check if they keys are unique (it is very possible they might not be) 
        IF 1 >= (SELECT TOP 1 COUNT(*) AS cnt FROM T_SYS_Language_Forms GROUP BY LANG_UID ORDER BY cnt DESC)
        BEGIN

            -- If no Primary key for this table
            IF 0 =  
            (
                SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
                WHERE CONSTRAINT_TYPE = 'PRIMARY KEY' 
                AND TABLE_SCHEMA = 'dbo' 
                AND TABLE_NAME = 'T_SYS_Language_Forms' 
                -- AND CONSTRAINT_NAME = 'PK_T_SYS_Language_Forms' 
            )
                ALTER TABLE T_SYS_Language_Forms ADD CONSTRAINT PK_T_SYS_Language_Forms PRIMARY KEY CLUSTERED (LANG_UID ASC)
            ;

            -- Adding foreign key
            IF 0 = (SELECT COUNT(*) FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS WHERE CONSTRAINT_NAME = 'FK_T_ZO_SYS_Language_Forms_T_SYS_Language_Forms') 
                ALTER TABLE T_ZO_SYS_Language_Forms WITH NOCHECK ADD CONSTRAINT FK_T_ZO_SYS_Language_Forms_T_SYS_Language_Forms FOREIGN KEY(ZOLANG_LANG_UID) REFERENCES T_SYS_Language_Forms(LANG_UID); 
        END -- End uniqueness check
        ELSE
            PRINT 'FSCK, this column has duplicate keys, and can thus not be changed to primary key...' 
    END -- End NULL check
    ELSE
        PRINT 'FSCK, need to figure out how to update NULL value(s)...' 
END 
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top