身份与插入数据冲突

时间:2016-04-14 07:40:18

标签: sql-server insert identity

我遇到了一个涉及在MS SQL服务器中运行mySQL代码的问题。 我使用身份在大多数表中自动增加id号。例如:

CREATE TABLE klant (
    klantnr INTEGER identity (1, 1) PRIMARY KEY,
    bedrijfsnaam VARCHAR (50) NOT NULL
)

我正在尝试在我的表Logins中插入此表中存在的相同“klantnr”值,该值被定义为Klant表的外键:

CREATE TABLE Logins (
    GebruikersNaam VARCHAR (30),
    Wachtwoord VARCHAR (30),
    Klantnr INT,
    MdwNr INT,
    CONSTRAINT pk_logID PRIMARY KEY (GebruikersNaam),
    CONSTRAINT fk_klantnr FOREIGN KEY (klantnr) REFERENCES klant (klantnr),
    CONSTRAINT fk_mdwnr FOREIGN KEY (mdwnr) REFERENCES medewerker (mdwnr)
)

以下是插页:

INSERT INTO klant VALUES ('Jumbo'); -- (this is the first insert, klantnr is 1)
INSERT INTO Logins VALUES ('KlantTest', 'test', 1, NULL);
  

错误:消息547,级别16,状态0,行302 INSERT语句   与FOREIGN KEY约束“fk_klantnr”冲突。冲突   发生在数据库“DorblogisticsB31B”,表“dbo.klant”,列   'klantnr'。

我做错了什么?

4 个答案:

答案 0 :(得分:1)

我很确定你忽略了一些非常小的东西,正如我们通常对这些类型的错误所做的那样,运行以下sql并查看是否得到相同的结果:(注意:不要尝试使用最佳实践或什么,只是想让你得到答案)

    IF OBJECT_ID('dbo.Logins', 'U') IS NOT NULL 
      DROP TABLE dbo.Logins; 

    IF OBJECT_ID('dbo.klant', 'U') IS NOT NULL 
      DROP TABLE dbo.klant; 

    CREATE TABLE klant (
        klantnr INTEGER identity (1, 1) PRIMARY KEY,
        bedrijfsnaam VARCHAR (50) NOT NULL
    )

    CREATE TABLE Logins (
        GebruikersNaam VARCHAR (30),
        Wachtwoord VARCHAR (30),
        Klantnr INT,
        MdwNr INT,
        CONSTRAINT pk_logID PRIMARY KEY (GebruikersNaam),
        CONSTRAINT fk_klantnr FOREIGN KEY (klantnr) REFERENCES klant (klantnr)
    )



    --re run this query 3 times...
    INSERT INTO klant VALUES ('Jumbo');
    INSERT INTO Logins VALUES ('KlantTest' + CONVERT(VARCHAR,(SELECT MAX(klantnr) FROM klant)),
                                 'test', 
                                 (SELECT MAX(klantnr) FROM klant) 
                                 , NULL);


    SELECT * FROM klant
    /*
    OUTPUT:
    1   Jumbo
    2   Jumbo
    3   Jumbo
    */
    SELECT * FROM Logins

    /*
    OUTPUT:
    KlantTest1  test    1   NULL
    KlantTest2  test    2   NULL
    KlantTest3  test    3   NULL
    */

答案 1 :(得分:0)

替代方法 以下是解决此问题的两种方法: 将外键约束中使用的所有列定义为NOT NULL。

-OR -

更新同一更新语句中外键约束中使用的所有列。

https://support.microsoft.com/en-us/kb/256307 https://dba.stackexchange.com/questions/62325/how-to-solve-the-error-msg-547-level-16-state-0-line-1

答案 2 :(得分:0)

插入[klant]后试试这个:

SELECT * FROM klant WHERE bedrijfsnaam='Jumbo'

通过这种方式,您可以找到为“Jumbo”分配的ID号。然后使用此ID,您可以将值插入[登录]。

答案 3 :(得分:0)

我修好了。这是有史以来最愚蠢的错误。我在插入klant数据之前尝试插入登录数据......