簡體   English   中英

如果不存在,則將多個值插入表 MySQL

[英]Insert Multiple Value into table MySQL if not exists

我有一個包含 3 列(ID、用戶名、全名)的表,我希望 ID 為 AUTOINCREMENT。 只有當表中不存在時,我才想插入到表中。

這是我的代碼:

$fullName = $_POST['fullname'];
$username = $_POST['username'];
$dbhost = "localhost";
  $dbname = "databasename";
  $dbusername = "root";
  $dbpassword = "";

  $link = new PDO("mysql:host=$dbhost;dbname=$dbname","$dbusername","");

  $statement = $link->prepare('INSERT INTO accounts (username, fullname)
      VALUES (:username, :fname)');

  $statement->execute([
      'fname' => $fullName,
      'username' => $usernameget,
  ]);

如果您的id已經是 autoncrement,那么您無需在查詢中提及。

您可以簡單地編寫以下查詢

insert into accounts (username,fullname) values( $username , $fullname )

這里有幾件事需要解決。

  • 如果不需要或不關心值,請不要指定列值。 必要或相關時指定。 在這種情況下,應該省略id
  • 始終為您的用戶數據使用占位符值。 切勿$_GET$_POST數據直接放入查詢中。
  • 為了避免重復,在表上添加一個UNIQUE約束。

要解決該問題,請調整代碼:

// Enable exceptions, avoiding the need for manual error checking
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

// Try and keep the order of things like this consistent through your code
$username = $_POST['username'];
$fullname = $_POST['fullname'];

// Here using a short, common name for the database handle $db    
$db = new mysqli("localhost","root","","database");

// Prepare your insert first as a query with no data, only placeholders
$db->prepare("insert into accounts (username,fullname) values(?,?)");

// Bind the data to the placeholders, here two string ("s") values.
$db->bind_param('ss', $username, $fullname);

// Execute the query
$db->execute();

要添加UNIQUE約束,請使用CREATE INDEX

CREATE INDEX idx_accounts_username (username);
CREATE INDEX idx_accounts_full_name (full_name);

那必須在你的 MySQL shell 中運行,而不是 PHP。

UNIQUE約束到位時,MySQL 將不允許重復數據。 請注意, NULL值不計算在內,可以“復制”。 在您的列上設置NOT NULL以強制它們完全唯一。

由於您的id是自動增量主鍵,因此您可以使用以下命令創建或更新它:

insert into accounts (username,fullname) values( $username , $fullname ) on duplicate key update username = '$username',fullname = '$fullname'

您可以使用 PHP 中的 if else 條件執行此操作

$fullname = $_POST['fullname'];
$username = $_POST['username'];

$chk = mysqli_query("select * FROM `accounts` where fullname='$fullname' and username='$username'");
$rs = mysqli_fetch_array($chk);
if($rs == "")
{
    $ins = mysqli_query("INSERT INTO `accounts`(fullname,username) VALUES ('$fullname','$username'))";
} 
else{
    echo "Duplicate entry";
}   

或者您也可以通過 SQL 查詢來執行此操作。

INSERT INTO accounts(username,fullname)
SELECT * from (SELECT '$username', '$fullname') AS tmp
WHERE NOT EXISTS
(SELECT username FROM accounts WHERE username='$username')

為了得到正確的答案,必須盡可能多地解釋問題。 你至少應該告訴你做了什么,然后你得到了什么。
據我所知,要實現您的目標,必須更改表結構並插入查詢。
記得接受答案,如果答案讓你滿意,請點擊upvote按鈕,
否則在問題中提供更多信息,以便在這里的成員可以給出正確的答案。

如果您了解表創建查詢,請轉到此答案的底部,否則請執行以下操作:
如果您使用 gui 創建表,
1.點擊創建新表。

在此處輸入圖片說明
2. 在右窗格中給出表名和列名,如圖所示。 (不要在“全名”中給出空格,而是給出“全名”或“全名”)

在此處輸入圖片說明 3. 向右滾動窗口,直到看到如圖所示的 A_I 列。

在此處輸入圖片說明 4. 勾選第一行(我們已用作id),將出現“添加索引”框。
只需點擊這里(在底部)。
您將被重定向到表列表,如圖所示。

在此處輸入圖片說明 6. 再次打開(單擊)您的表。

在此處輸入圖片說明 7.點擊結構。
在此處輸入圖片說明 現在假設您不想在“用戶名”列中出現重復項,請單擊此列並單擊“唯一”,如圖所示

在此處輸入圖片說明 如果您不想在兩列的值在一起時重復,請單擊兩列,然后單擊“唯一”,如圖所示

在此處輸入圖片說明



如果您了解創建表命令:

這是上面的 sql:CREATE TABLE accounts ( id int(11) NOT NULL AUTO_INCREMENT, username varchar(25) NOT NULL, fullname varchar(55) NOT NULL, PRIMARY KEY ( id ), UNIQUE KEY username ( username ) ENGINE =MyISAM 默認字符集=latin1


具有上述表結構的記錄將自動遞增,並且不會添加重復的名稱。 (記住在插入查詢時處理重復條目錯誤
插入忽略
有了這個,您的查詢將是:

$statement = $link->prepare('INSERT IGNORE INTO accounts (username, fullname)
      VALUES (:username, :fname)');


或者你也可以使用
在重復密鑰上)

如果未設置為自動增量,請先設置您的主鍵(例如 id)

第二個使用多個插入值

INSERT IGNORE INTO accounts (username,fullname) VALUES ("p","k"),("c","s");

IGNORE 關鍵字用於復制

如果你想用PDO 看

暫無
暫無

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

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