【发布时间】:2009-12-15 19:41:06
【问题描述】:
更新:在 SQL Server 2008 上运行时不会发生此问题。所以这对于 SQL Server 2000 来说有些奇怪(或错误)。
我尝试在 SQL Server 2000 上进行简单的插入:
INSERT INTO UserAddresses (UserId, AddressId)
SELECT UserId, Id
FROM Addresses
我明白了:
INSERT 语句与 COLUMN FOREIGN KEY 约束 'FK569ABB5045EE0940'。冲突 发生在数据库“订单”表中 “地址”,“ID”列。
我很清楚这意味着什么,但我不明白为什么会发生冲突 - 请注意,我从 Addresses 表中插入了 ID,所以它们确实存在!为什么 SQL Server 在 Addresses 表的外键端找不到它们?我应该做傻事吗
SELECT * FROM Addresses
WHERE Id NOT IN (SELECT Id FROM Addresses)
还是什么?
更多信息:ID 是 GUID,数据来自旧数据库(导入)。首先我填充地址,然后尝试插入用户地址。如果我做 SELECT TOP 100 ... 它可以工作...所以这是一些记录的问题,但我不明白为什么会发生。
CREATE TABLE [Addresses] (
[Id] [uniqueidentifier] NOT NULL ,
PRIMARY KEY CLUSTERED ([Id]) ON [PRIMARY] ,
) ON [PRIMARY]
CREATE TABLE [Users] (
[Id] [uniqueidentifier] NOT NULL ,
PRIMARY KEY CLUSTERED ([Id]) ON [PRIMARY]
) ON [PRIMARY]
CREATE TABLE [UserAddresses] (
[UserId] [uniqueidentifier] NOT NULL ,
[AddressId] [uniqueidentifier] NOT NULL ,
CONSTRAINT [FK569ABB5045EE0940] FOREIGN KEY
(
[AddressId]
) REFERENCES [Addresses] (
[Id]
),
CONSTRAINT [UserAddressesToAddressFK] FOREIGN KEY
(
[UserId]
) REFERENCES [Users] (
[Id]
)
) ON [PRIMARY]
ALTER TABLE Addresses ADD UserId UNIQUEIDENTIFIER
INSERT INTO Addresses (UserId, Id)
SELECT legacy_userid, legacy_single_useraddressid -- both are guids
FROM LegacyUsers INNER JOIN LegacyAddresses
更新:我刚刚完成,没有错误(查询批处理完成):
DECLARE c CURSOR FOR SELECT UserId, Id FROM Addresses
OPEN c
DECLARE @uid UNIQUEIDENTIFIER, @aid UNIQUEIDENTIFIER
FETCH NEXT FROM c INTO @uid, @aid
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @aid
INSERT INTO UserAddresses (UserId, AddressId)
VALUES (@uid, @aid)
FETCH NEXT FROM c INTO @uid, @aid
END
CLOSE c
DEALLOCATE c
我想知道为什么在 foreach 游标工作时 INSERT 失败...
更新:哎呀,游标完成后,INSERT 也可以工作。但它永远不会独立工作。这是我的工作:
- 运行导入脚本以填充地址表
- 手动运行 INSERT - 失败
- 手动运行 CURSOR - 有效
- 从用户地址中删除
- 手动运行 INSERT - 现在可以使用了
这是魔法还是我完全是个白痴错过了什么?
更新:如果我这样做了
ALTER TABLE UserAddresses DROP CONSTRAINT FK569ABB5045EE0940
INSERT INTO UserAddresses (UserId, AddressId)
SELECT UserId, Id
FROM Addresses
alter table UserAddresses
add constraint FK569ABB5045EE0940
foreign key (AddressId)
references Addresses
它也有效。我认为这是 SQL Server 2000 中的一个错误,尽管有“从不责怪编译器”规则。
【问题讨论】:
-
UserAddresses 表的定义是什么?
-
也许您想比
CONSTRAINT [FK569ABB5045EE0940]更直观地命名您的约束 -CONSTRAINT FK_UserAddresses_Addresses左右怎么样? -
您确定我通过输入名称将约束命名为 FK569ABB5045EE0940 吗? ;-) 这是由 ORM 完成的,正如您在上面看到的那样,即使我将它们命名为 UserAddressesToAddressFK,只是它不能以相反的方式工作(我想 FluentNHibernate 限制,必须找出)。无论如何,我看不出这会有什么帮助。
-
我唯一能想到的是你的一些 guid 不是 MSSQL 识别的格式,但它是一个很长的镜头,因为它不能解释为什么你的第二个 1 到 5 序列有效.. .
-
@Locksfree:列定义为带有 FK 的 GUID。所以不太可能
标签: sql sql-server sql-server-2000