好的,这就是我想做的事。
表1( globalID [主键,自动增加](是我将在PHP中使用的全局ID))
表2& table3( ID * [外部主键,引用globalID],此后的其他列,每个表2和3都不同);
我想知道的是,如果有一种方法,以及如何使它成为当我在table2或table3中插入一行时,talbe1中的globalID被填充并且它的值也相应地作为一个插入table2或table3中ID。我认为这将通过一个触发器完成,但触发器不是我的强项,所以如果这是唯一的方法,请提供一个例子。
我还在考虑将其扩展到这种情况:
表1( globalID [主键,自动增加](是我将在PHP中使用的全局ID), 其他ID [一个UUID]);
表2& table3( ID * [外部主键,引用其他ID],此后的其他列,每个表2和3都不同);
但是在这种情况下,在某些表中插入新行时,仍然几乎不存在2个用户可能生成相同UUID的可能性。我想知道是否可以通过自动生成sql server生成的密钥来避免这种情况,而不必将其编写为PHP服务器端。
如果有人解决了这个问题并且还可以指出我需要注意或考虑的其他事项,请指出它们。另请提供解决方案的示例。
编辑:
@John 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相同,我也考虑过这一点。
考虑到所有这一切,我会选择我找到的解决方案,但是我会接受你的回答,因为你确实试图提供帮助,而且你确实带来了一些好主意。
再次感谢。
答案 0 :(得分:0)
我是一个mssql人,但我认为这是不可能的,除非你可以为你的数据库创建一个“BEFORE INSERT”触发器(即使这样也会有问题),因为:
无论桌子2的ID是多少? 3是,无论是整数还是guid,这些都是主键:作为主键,此列不允许空值,但您需要的主要是在这些表中创建新行,此列为null,然后生成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
希望这有帮助