簡體   English   中英

如何使用PDO和MySQL在多個表中進行INSERT INTO?

[英]How do an INSERT INTO in more than once table with PDO and MySQL?

我使用以下SQL構建了兩個表:

CREATE TABLE state(
   IDstate INTEGER not null auto_increment,
   state_name VARCHAR(40) not null,
   UNIQUE(state_name),
   CONSTRAINT IDstate PRIMARY KEY(IDstate)
)auto_increment=100;

CREATE TABLE city(
   IDcity INTEGER not null auto_increment,
   city_name VARCHAR(60) not null,
   IDstate INTEGER not null,
   CONSTRAINT IDcity PRIMARY KEY(IDcity),
   CONSTRAINT IDstate FOREIGN KEY(IDstate) REFERENCES state(IDstate)
)auto_increment=100;

我想用PHP-PDO-MySQL創建一個函數,我確定下一個:

  1. 我的函數接收兩個參數: $state$city
  2. 我必須避免價值觀的重復。

     $dbcon=new PDO('mysql:host=localhost; dbname=hotel','root', ''); $sql = "SELECT IDstate FROM state WHERE state_name=:state_name"; $query = $dbcon->prepare($sql); $query->execute(array(':state_name'=>$state_name)); $array = $query->fetchAll(); if ($query->rowCount() == 0){ $sql = "INSERT INTO state (state_name) VALUES (:state_name);"; $query = $dbcon->prepare($sql); $query->execute(array(':state_name'=>$state_name)); $sql = "INSERT INTO city (city_name, IDstate) VALUES (:city_name, :IDstate);"; $query = $dbcon->prepare($sql); $query->execute(array(':city_name'=>$city_name, ':IDstate'=>$dbcon->lastInsertId())); } else { $IDstate = $array[0]['IDstate']; $sql = "INSERT INTO city (city_name, IDstate) VALUES (:city_name, :IDstate)"; $query = $dbcon->prepare($sql); $query->execute(array(':city_name'=>$city_name, ':IDstate'=>$IDstate)); print_r($query->rowCount()); } 

我需要介紹以下選項:

  1. 插入新的州和城市。
  2. 為現有州插入新城市。
  3. 避免同時插入現有州和城市。

上面的代碼工作正常,但我想對其進行改進。 我正在閱讀的最佳選擇是編寫transaction而不是先前的代碼。

另一方面,我需要添加第三張表,也許是第四張表,我想我在重復很多代碼: 樣板代碼

我希望您的意見和建議。

Transactions用於實現原子性,一致性,隔離性和持久性(ACID)。 那就是所有insert語句都應該執行,或者如果其中任何一個失敗,則所有其他語句都應回滾。 我們開始一個事務,然后繼續執行insert語句,如果在執行所有語句之后沒有出現技術/業務錯誤,則commit事務,否則rollback 如果回滾,則所有插入語句將被取消,該語句在開始transaction之后執行。 如果這是您想要的,這是一個通過事務進行多次插入的鏈接。

http://php.net/manual/zh/pdo.transactions.php

因此,這可能無法完全回答您的問題,但這是我的想法:

  • 如果有效,請不要修復。
  • 您正在使用什么引擎? 如果您正在使用MySQL的MyISAM表,它將不支持事務並且不會返回錯誤。
  • 根據您期望的音量大小,您應該不會太慢。
  • 為您的選擇添加一個限制,因為您只會獲得1個州名稱。 極限會大大提高性能。
  • 美國最長的州名是13個字符,而不是40個字符

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM