+ -
当前位置:首页 → 问答吧 → 自增字段做外键害死人,血泪经验希望对新手有帮助。

自增字段做外键害死人,血泪经验希望对新手有帮助。

时间:2011-11-26

来源:互联网

在做分布式数据采集系统的时候,最初有一张表的外键是自增字段,而分布式的特点就是需要数据在多个数据库之间互相导来导去,这样就会打乱自增字段的值,必须开发一个存储过程或用其他语言开发一个控制器来控制字段不会被打乱,由于硬件和网络的限制,导致该控制器(或存储过程)开发难度极大,同时又有多个系统供应商之间需要开发数据接口,每增加一个供应商,就要重新开发一遍,而每开发一遍,都有巨大的开发难度。不仅如此,自己公司开发的软件之间互相导数据也会存在打乱自增字段值的问题,所以本人强烈建议在设计分布式数据采集系统时,凡是要用到外键的地方,都不要用自增字段了。

作者: Superion   发布时间: 2011-11-26

SQL code
SET IDENTITY_INSERT 表名 on;

...新增


SET IDENTITY_INSERT 表名 off;

go
USE AdventureWorks;
GO
-- Create tool table.
CREATE TABLE dbo.Tool(
   ID INT IDENTITY NOT NULL PRIMARY KEY, 
   Name VARCHAR(40) NOT NULL
)
GO
-- Inserting values into products table.
INSERT INTO dbo.Tool(Name) VALUES ('Screwdriver')
INSERT INTO dbo.Tool(Name) VALUES ('Hammer')
INSERT INTO dbo.Tool(Name) VALUES ('Saw')
INSERT INTO dbo.Tool(Name) VALUES ('Shovel')
GO

-- Create a gap in the identity values.
DELETE dbo.Tool 
WHERE Name = 'Saw'
GO

SELECT * 
FROM dbo.Tool
GO

-- Try to insert an explicit ID value of 3;
-- should return a warning.
INSERT INTO dbo.Tool (ID, Name) VALUES (3, 'Garden shovel')
GO
-- SET IDENTITY_INSERT to ON.
SET IDENTITY_INSERT dbo.Tool ON
GO

-- Try to insert an explicit ID value of 3.
INSERT INTO dbo.Tool (ID, Name) VALUES (3, 'Garden shovel')
GO

SELECT * 
FROM dbo.Tool
GO
-- Drop products table.
DROP TABLE dbo.Tool
GO

作者: roy_88   发布时间: 2011-11-26

單機版可以用,有數據交換吧不可用

作者: roy_88   发布时间: 2011-11-26

每个数据库上用不同标示初始值
一个从 1开始
那个两个从 1亿或者10亿开始 

前面还可以带个减号。


不知道这个满足你们不

作者: Beirut   发布时间: 2011-11-26

自增列存在是有它一定道理的。在程序处理的时候取行值比较容易,而且如果设置为聚集索引,效率很高。

还有它的唯一性。当然还有N多用法。这里不一一举例了

作者: fredrickhu   发布时间: 2011-11-26

引用 3 楼 beirut 的回复:
每个数据库上用不同标示初始值
一个从 1开始
那个两个从 1亿或者10亿开始

前面还可以带个减号。


不知道这个满足你们不

现在有50多个数据库,而且有些数据库需要不断的删除数据,这些数据库的数据都没有一定的顺序,顺序完全是随机的。(因为可能由于网络阻塞或停机维护等客观原因导致顺序错乱)

作者: Superion   发布时间: 2011-11-26

引用 4 楼 fredrickhu 的回复:
自增列存在是有它一定道理的。在程序处理的时候取行值比较容易,而且如果设置为聚集索引,效率很高。

还有它的唯一性。当然还有N多用法。这里不一一举例了

如果两张表是主外键关系,一张表的主键重建了,另一张表就要跟着修改,而且主键重建是很频繁的,平均一天就有1000多次重建,这样搞肯定是不行的,所以不能用自增主键做外键了。

作者: Superion   发布时间: 2011-11-26

谢谢分享经验

作者: koumingjie   发布时间: 2011-11-26