我遇到了一个涉及在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'。
我做错了什么?
答案 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数据之前尝试插入登录数据......