Frage

Ich habe noch nie "von hand codiert" - Objekt erstellen code für SQL Server-und foreign key-Unabhängigkeitserklärung ist scheinbar der Unterschied zwischen SQL Server und Postgres.Hier ist meine sql so weit:

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

Wenn ich die Abfrage ausführen, bekomme ich diesen Fehler:

Msg 8139, Ebene 16, Status 0, Zeile 9 Anzahl der referenzierenden Spalten in foreign key-unterscheidet sich von der Anzahl der referenzierte Spalten, Tabelle 'question_bank'.

Erkennen Sie die Fehler?

War es hilfreich?

Lösung

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

Andere Tipps

Und wenn Sie wollen einfach nur, um erstellen Sie die Einschränkung auf Ihre eigenen, Sie verwenden können die ALTER TABLE -

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

Ich würde nicht empfehlen, die syntax, die erwähnt von Sara Chipps für inline-Erstellung, nur würde ich da eher die Namen meiner eigenen Einschränkungen.

Sie können auch Ihr name foreign key-Einschränkung mit:

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

Ich mag AlexCuse Antwort, aber etwas, das Sie sollte zahlen Aufmerksamkeit zu, Wann immer Sie hinzufügen eine foreign key-Einschränkung ist, wie Sie updates erhalten möchten, um eine Spalte in einer Zeile der referenzierten Tabelle behandelt zu werden, und vor allem, wie Sie möchten, löscht der Zeilen in der referenzierenden Tabelle behandelt werden.

Wenn eine Einschränkung wird wie folgt erstellt:

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

..dann Aktualisierungen oder Löschvorgänge in der referenzierten Tabelle wird Schlag mit einer Fehlermeldung, wenn es eine entsprechende Zeile in der Tabelle verweisen.

Das könnte das Verhalten Sie wollen, aber in meiner Erfahrung, es sehr viel häufiger nicht.

Wenn Sie stattdessen schaffen es wie folgt:

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

..dann Aktualisierungen und Löschungen in der übergeordneten Tabelle wird Ergebnis in updates und löscht die entsprechenden Zeilen in der referenzierenden Tabelle.

(Ich schlage nicht vor, dass die Standardeinstellungen sollten geändert werden, wird die Standard-Irrt auf der Seite der Vorsicht, das ist gut.Ich sage nur, es ist etwas, das eine person, die das erstellen constaints sollten immer darauf achten,.)

Dies kann getan werden, durch die Möglichkeit, beim erstellen einer Tabelle wie dieser:

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

- Das wird auch funktionieren.Pehaps ein bisschen mehr intuitive konstruieren?

Wenn Sie möchten, erstellen Sie zwei Tabellenspalten in einer Beziehung mit einer Abfrage versuchen, die folgenden:

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)

Erstellen Sie einen Fremdschlüssel in einer Tabelle

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)

Wie Sie, ich nicht in der Regel erstellen Sie Fremdschlüssel mit der hand, aber wenn, für einige Grund, ich brauche das Skript, so dass ich in der Regel erstellen Sie mit ms sql server management studio und vor dem speichern ändert sich dann, ich wählen Sie Tabelle-Designer - | Generate Change Script

Dieses Skript ist zum erstellen von Tabellen mit foreign key-und ich fügte hinzu, Referentielle Integrität Einschränkung 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.
Tatsächlich tun dies richtig ist ein wenig komplizierter.

Zuerst müssen Sie überprüfen, ob die primär-Schlüssel ist vorhanden für Sie die gewünschte Spalte, um Ihren Fremdschlüssel verweisen.

In diesem Beispiel ein Fremdschlüssel der auf die Tabelle T_ZO_SYS_Language_Forms erstellt, verweisen auf 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 
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top