代码之家  ›  专栏  ›  技术社区  ›  user24881

在两个表之间共享自动递增的主键

  •  9
  • user24881  · 技术社区  · 16 年前

    我正在使用SQLServer9.0.3068。

    谢谢

    9 回复  |  直到 16 年前
        1
  •  14
  •   ballpointpeon    16 年前

    只需将标识增量配置为>1例如,表1使用标识(1,10)[1,11,21…],表2使用标识(2,10)[2,12,22…]。如果以后需要,这也会给您一些扩展空间。

        2
  •  3
  •   Galwegian    16 年前

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

    SELECT NEWID()
    
        3
  •  2
  •   Ilya Kochetov    16 年前

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

        4
  •  1
  •   Bravax    16 年前

    使用另一个ID键为int类型的表,将其默认为1,称为KeyID或其他。

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

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

        5
  •  1
  •   Bill Karwin    16 年前

    我不是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(), ...);
    
        6
  •  0
  •   wcm    16 年前

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

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

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

        7
  •  0
  •   Pittsburgh DBA    16 年前

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

    如果GUID不适用于您,并且您绝对必须具有int、bigint或类似内容,那么您可以始终只使用一个标识列,并使每个表具有不同的种子值。这些数据类型具有非常广泛的范围,并且将范围划分为可用段并不太困难,特别是如果您只需要两个拆分。例如,基本int的范围从-2^31(-2147483648)到2^31-1(2147483647)。例如,对于客户表来说,这已经足够了。

    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
    )
    
        8
  •  0
  •   Daniel Casserly    14 年前

    如果您真的需要对int执行此操作,并且您有一个自动递增的数字,那么我以前执行此操作的方法是将id field auto increment函数更改为另一个表的序列。在ms sql或my sql中,我不太确定,但在pgsql中,这意味着在sql中,您将有此字段

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

    其中,table_two_sequence是另一个表的序列函数。然后通过插入一些数据来测试它。我真的很抱歉,如果这在ms sql中不起作用,我会尽量避开它。失败的GUID是最好的方式,正如其他人所提到的。或者,当你插入你使用的代码时,你可以在其中加入一个算法,但它可能会变得混乱。

    或者,考虑将数据放在一个表中,因为这是一种解决方法。如果需要,可以使用一个模拟两个表的视图。只是一个想法。

    希望我能帮上忙

        9
  •  0
  •   Darrel Lee    8 年前

    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