0

好的,这就是我想做的。


表 1(globalID [主键,自动递增](是我将在 PHP 中使用的全局 id))


Table2 & table3( ID * [外键,引用globalID],后面的其他列,表2和表3各不相同);


我想知道的是是否有办法以及如何做到这一点,以便当我在 table2 或 table3 中插入​​一行时,talbe1 中的 globalID 被填充,并且它的值也相应地作为 ID 插入到 table2 或 table3 中。我认为这将通过触发器来完成,但触发器不是我的强项,所以如果这是唯一可以完成的方法,请提供一个示例。

我也在考虑将其扩展到这种情况:


Table1( globalID [primary key, autoincremented] (是我在 PHP 中使用的全局 id), OtherID [an UUID]);


Table2 & table3( ID * [外键,引用OtherID],后面的其他列,表2和表3各不相同);


但在这种情况下,仍然几乎不存在 2 个用户在某个表中插入新行时生成相同 UUID 的可能性。我想知道是否可以通过使 sql 服务器自动生成密钥来避免这种情况,而无需我在 PHP 服务器端对其进行编码。

如果有人解决了这个问题并且还可以指出我需要注意或考虑的其他事项,请指出。另请提供解决方案的示例。


编辑:

@约翰B。

由 TosheX 编辑

感谢您的答复。与此同时,我一直在阅读这方面的内容,并且我已经有了 SQL 之外的解决方案(在 php 中)。基本上我使用 Yii PHP 框架,在其中创建表格模型,并创建一个活动记录来填充新行。现在,当我这样做时,会生成 table1 中的 ID,然后我仍然有一个指向该填充行的变量,我可以读取生成的 ID,因为它是自动获取的(无需检查数据库中的最后一条记录,这可能会返回某人在我之后创建的几毫秒的记录)。之后我只需要在适当的 table2 或 3 中创建一行并为 ID 分配已经生成的值。

我在这里找到了这个想法:

http://www.yiiframework.com/forum/index.php/topic/14593-alternate-for-mysql-insert-id/

我真的想在数据库中有一个内置的解决方案,但是因为我有数据库经验并且对触发器有足够的了解(足够不喜欢它们:D)我知道这是一个非常棘手的代码,所以我想知道是否有替代方案自动填充什么的。

不过,我真的很感谢您的回复,因为您花了很多时间。我也一直在 msSQL 中工作,我在你所说的中找到了逻辑。mySQL 中的 UUID 与 msSQL 中的 GUID 相同,如您所见,我也考虑过这一点。

考虑到所有这些,我将采用我找到的解决方案,但我会接受您的回答,因为您确实尝试提供帮助,并且您确实提出了一些好主意。

再次感谢。

4

1 回答 1

0

我是一个 mssql 人,但我认为这是不可能的,除非你可以为你的数据库创建一个“BEFORE INSERT”触发器(即使这样也会有问题),因为:

无论表 2 和表 3 的 ID 是什么,无论是整数还是 guid,这些都是主键:作为主键,此列不允许空值,但您需要的基本上是在这些表中创建新行,使用此列为空,然后在 Table1 中生成新行,并使用该表中的新值更新 Table2 或 Table3 中的新行。

因此,您可能需要:

在代码中(即在 SQL 之外)执行一个解决方案,首先在 Table1 中创建一个新行,然后在随后在 Table2/3 中创建时使用此值,或者:

在tables2/3 上,您的主键有一个自动递增的列,我们将其称为“PK”,然后将ID 作为一个单独的普通FK,但它允许空值,加上一个触发器,如下所示(尽管您可能需要稍微修改一下语法,因为我是一个mssql人,我不知道你的db语法):-(

此外,此示例旨在使用多行插入,并使用游标来实现此目的,即使在 mssql 中,我的游标语法也充其量是狡猾的!

CREATE TRIGGER trg_Table2 ON dbo.Table2
FOR INSERT   /* might be AFTER INSERT etc */
AS BEGIN
  SET nocount on;

  Declare ICursor Scroll For SELECT PK FROM Inserted;
  Declare @PK int,
          @GlobalID int,
          @ID guid;

  OPEN ICursor
  FETCH Next From ICursor INTO @PK
  WHILE @@Fetch_Status BEGIN
    INSERT Table1 (OtherID) VALUES (NewID());
    SELECT @GlobalID = @@Identity 
    SELECT @ID = OtherID FROM Table1 WHERE GlobalID = @GlobalID
    UPDATE Table2 SET ID = @ID WHERE PK = @PK

    FETCH Next FROM ICursor INTO @PK
  END
  Close ICursor
  Deallocate ICursor
END

希望这可以帮助

于 2012-08-24T04:21:20.000 回答