日期:2014-05-18  浏览次数:20731 次

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

------解决方案--------------------
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

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

前面还可以带个减号。


不知道这个满足你们不
------解决方案--------------------
自增列存在是有它一定道理的。在程序处理的时候取行值比较容易,而且如果设置为聚集索引,效率很高。

还有它的唯一性。当然还有N多用法。这里不一一举例了
------解决方案--------------------
谢谢分享经验