Mysql
如何在聯結表中為多對多關係插入值?
我在數據庫中有三個表:
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() 以確保您知道它是如何工作的。在某些情況下,它可能會給您帶來不希望的結果,例如當您使用單個插入語句插入多行時。