Mysql

如何在聯結表中為多對多關係插入值?

  • April 3, 2015

我在數據庫中有三個表:

trips(trip_id(pk), trip_name(unique), user_id(fk))

places(place_id(pk), place_name(unique))

trips_places_asc(trip_id(fk), place_id(fk))

由於許多旅行可以有很多地方,所以我有一張如上所述的連接表。

如果使用者在行程中插入地點,這些地點將被添加到places表中,並且行程將與trips_places_asc表中的地點相關聯。

因此,如果我編寫如下查詢:

INSERT INTO places (place_name)
VALUES ('XYZ')

INSERT INTO trips (trip_name)
VALUES ('MyTrip')

那麼如何在 Junction 或 Association 表中儲存trip_id和?我必須觸發兩個查詢嗎?place_id``trips_places_asc

您希望保持儲存新地點和旅行的動作的原子性,以及兩者之間的交集。在 MySQL 中,您使用START TRANSACTION/COMMIT事務包裝器來執行此操作。

您使用 MySQL 函式LAST_INSERT_ID()(參見文件;類似於 SQL Server 變數@@IDENTITY)來獲取最近分配的自動增量值的值。

要添加地點旅行並同時將兩者關聯起來,您可以編寫如下程式碼:

START TRANSACTION

DECLARE placeKey int

INSERT INTO places (place_name)
VALUES ('XYZ')

SET placeKey = LAST_INSERT_ID()

DECLARE tripKey int

INSERT INTO trips (trip_name)
VALUES ('MyTrip')

SET tripKey = LAST_INSERT_ID()

INSERT INTO trips_places_asc(trip_id, place_id)
VALUES (tripKey, placeKey)

COMMIT

您應該在上面添加錯誤處理,如果在中途發生錯誤,請使用ROLLBACK命令撤消部分完成的工作。

您還應該閱讀 LAST_INSERT_ID() 以確保您知道它是如何工作的。在某些情況下,它可能會給您帶來不希望的結果,例如當您使用單個插入語句插入多行時。

引用自:https://dba.stackexchange.com/questions/81604