2008-10-03 101 views
8

嗨,我希望有两个表,每个都有一个INT“id”列,它将自动递增,但我不希望任何“id”列共享相同的数字。这是什么叫做,什么是最好的办法呢?序列?迭代器?指数?增量器?我们正在从一个模式迁移到另一个模式,并且拥有一个读取这两个表并显示(int)ID的网页,但我无法为这两个表使用相同的ID。在两个表之间共享自动递增的主键

我正在使用SQL Server 9.0.3068。

谢谢!

+0

你能补充说明为什么需要吗?可能有更好的设计,不需要使用GUID。 – 2008-10-03 15:29:47

回答

14

只需将身份增量配置为> 1即可表1使用IDENTITY(1,10)[1,11,21 ...],表2使用IDENTITY(2,10)[2,12,22 ...]。如果稍后需要,这也会给你一些扩展空间。

+0

我到底该怎么做?无论如何要使用PHPMyadmin来做到这一点? – everconfusedGuy 2012-09-14 19:50:27

3

我认为使用GUID将是最直接的方法,如果我正确理解你的话。

SELECT NEWID() 
+0

对不起,我应该提到它需要一个int。 – user24881 2008-10-03 15:31:17

2

使用带有GUID(全局唯一标识符)类型的列。它是16字节,并且对于每一行都是唯一的。

请注意,与普通整数键相比,您将获得显着的性能提升。

1

使用另一张带有int类型ID键的表,默认它为1,称为KeyID或其他。

让存储过程检索值,添加1,然后更新KeyID,然后将其返回到正在更新需要新唯一键的两个表的存储过程。

这将确保ID是一个i​​nt,并且它是使用存储过程生成新ID的一组表之间唯一的。

0

我不知道你会怎么称呼它。

如果你不想使用一个GUID或一个单独的表,你也可以创建一个函数,查看这两个表中的ID的最大值并将其添加到该值(或类似的东西) 。

然后,您可以在两个表上的插入触发器中调用该函数。

0

我个人对GUID解决方案很感兴趣,但这里有一个可行的选择。

此问题的许多解决方案都避免了GUID并使用了好的旧整数。这在合并复制情况下也很常见,在这种情况下,许多卫星站点与主站合并,并且需要避免关键冲突。

如果GUID不适合你,而且你绝对必须有int,bigint或类似的东西,你总是可以使用IDENTITY列,并为每个表使用不同的SEED值。这些数据类型的范围非常广泛,将范围分割成可用段并不难,特别是如果你想要的是两个分割。例如,基本int的范围从-2^31(-2,147,483,648)到2^31 - 1(2,147,483,647)。例如,这对于客户表来说已经足够了。

Transact-SQL参考(SQL Server 2000中) int, bigint, smallint, and tinyint

例子:

--Create table with a seed of 1 billion and an increment of 1 
CREATE TABLE myTable 
(
primaryKey int IDENTITY (1000000000, 1), 
columnOne varchar(10) NOT NULL 
) 
1

您可以定义第三个表的IDENTITY列,用它来生成ID值,但总是将您制作的任何插入物回滚到表格中(以避免增加)。回滚事务不会回滚该ID已生成的事实。

我不是Microsoft SQL Server的常规用户,所以请原谅任何语法错误。但是像下面就是我心目中:

CREATE TABLE AlwaysRollback (
    id IDENTITY(1,1) 
); 

BEGIN TRANSACTION; 
INSERT INTO AllwaysRollBack() VALUES(); 
ROLLBACK TRANSACTION; 

INSERT INTO RealTable1 (id, ...) VALUES (SCOPE_IDENTITY(), ...); 

BEGIN TRANSACTION; 
INSERT INTO AllwaysRollBack() VALUES(); 
ROLLBACK TRANSACTION; 

INSERT INTO RealTable2 (id, ...) VALUES (SCOPE_IDENTITY(), ...); 
0

如果你真的需要一个int做到这一点,你有一个自动递增数字,我以前做过这样的方式是改变id字段自动递增功能到另一个表的顺序。我不是在MS SQL或我的SQL,但在pgsql的不太清楚这意味着,在SQL你会有这个领域

id integer NOT NULL DEFAULT nextval('table_two_seq'::regclass), 

其中table_two_sequence是其他表中序列的功能。然后插入一些数据进行测试。我真的很抱歉,如果这不会工作在MS SQL我试图避开它tbh。如果没有其他人提到GUID是最好的方法。或者,当插入你使用的代码时,你可以在其中加入一个算法,但它可能会变得混乱。

或者,考虑将数据放在一张表中,因为这会绕过它。如果你需要,你可以有一个模拟两个表的视图。只是一个想法。

希望我帮助

0

与SQL Server 2012开始,你可以声明一个序列对象 https://msdn.microsoft.com/en-us/library/ff878091.aspx这正是你需要的。

我应该是非常平凡的模仿序列对象与表 包含下一个序列值和存储过程原子 选择值和增量。 [你喜欢使用功能,但功能 不能有副作用。]

这个黑客怎么样?创建一个包含两列的表(MySequence):标识列(SequenceValue)和虚拟列(DummyValue),并使用此存储过程获取新的序列值。表格中唯一的行将被检索到最后的序列值。

CREATE PROCEDURE GetNextValue 
AS 
BEGIN 
    DECLARE @value int = null; 

    -- Insert statements for procedure here 
    INSERT into MySequence (DummyValue) Values (null); 

    SET @value = SCOPE_IDENTITY(); 

    DELETE from MySequence where SequenceValue <> @value 

    SELECT @value as Sequence 

    return @value 
END 

要使用序列,您必须管理插入到目标表 - 触发器可能会工作。