2012-08-24 83 views
0

好的,這是我想要做的。mySQL:2個其他表的索引表


表1(globalID [主鍵,自動增量](是一個全局ID i的PHP會使用))


表2 &表3(ID * [外部主鍵,引用globalID],之後的其他列,對於表2和3中的每一個都是不同的);


我wannt知道的是,如果有一種方法,以及如何使它這樣,當我插入表2行或表3的globalID在talbe1被填充,它的價值還插在表2或table3相應地作爲一個ID。我認爲這將通過一個觸發器來實現,但觸發器並不是我的專長,所以如果這是可以完成的唯一方法,請舉例說明。

我也在想將其擴大到這種情形的:


表1(globalID [主鍵,自動遞增的(是一個全球性的ID我在PHP會使用), 其他ID [一個UUID]);


表2表3 &(ID * [外國主鍵,引用到OtherID],其它列在此之後,對每個的表2和3不同);


但在這種情況下,那裏仍是幾乎不存在可能性,而在一些表中插入新行2個用戶可能會產生相同的UUID。我想知道是否可以通過自動生成sql服務器生成的密鑰來避免這種情況,而不必爲PHP服務器端編寫代碼。

如果有人已經解決了這個問題,也可以指出我需要注意或考慮的其他事情,請將它們指出來。也請提供一個解決方案的例子。


編輯:

@約翰B.

編輯由TosheX

感謝你的回覆。在此期間,我一直在閱讀這篇文章,並且我已經有了一個SQL以外的解決方案(在php中)。基本上我使用Yii PHP框架創建表格的模型,並創建一個活動記錄來填充新行。現在當我這樣做時,會生成table1中的ID,然後我仍然有一個指向該填充行的變量,並且我可以讀取生成的ID,因爲它會自動提取(不必檢查數據庫中的最後一條記錄,這可能會返回某人在毫秒後創建的記錄)。之後,我只需要在適當的表格2或3內創建一行,併爲該ID分配已經生成的值。

,我發現這裏的想法:

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

我真的很想在數據庫中內置的解決方案,但因爲我有數據庫的經驗和做足夠的瞭解觸發器(夠不喜歡他們:d )我知道這是一個非常棘手的代碼,所以我想知道是否有替代自動填充或什麼的。

不過,我真的很感謝你的迴應,因爲你花了你所有的時間和精力。我一直在msSQL工作,並且我發現你說的邏輯。 mySQL中的UUID與msSQL中的GUID相同,我也已經考慮過了,如你所見。

考慮到所有這些因素,我會用我找到的解決方案,但是我會接受你的答案,因爲你確實試圖幫助你,並且你確實帶來了一些好的想法。

再次感謝。

回答

0

我是MSSQL的人,但我不認爲這是可能的,除非你能爲你的數據庫創建一個「BEFORE INSERT」觸發器(甚至那麼這將是有問題的),因爲:

不管是什麼表2 & 3是,不論是一個整數還是一個guid,它們都是主鍵:作爲主鍵,此列不允許爲空,但您所需要的基本上是在這些表中創建新行,此列null,然後在Table1中生成一個新行,並使用該表中的新值更新Table2或Table3中的新行。

因此,你可能需要:

不要在代碼中的溶液(即SQL外),讓你引起表1新行的創建,然後再使用時,隨後創造了這個值表2/3,或者:

在表格2/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 

希望這有助於