我有一個MySQL看起來像這樣的表,pKeyprimary_AI 鍵在哪里。
------ ----------- ---------- ----------
| pKey | firstName | LastName | Username |
------ ----------- ---------- ----------
| 1 | John | Brown | jBrown |
| 2 | Jake | Smith | jSmith |
| 3 | Mary | Laurier | mLaurier |
------ ----------- ---------- ----------
我想創建一個查詢,LastName當給定firstName. 例如,當提供firstNameof時John,例如,我想將姓氏更改為Wilson.
我撰寫此查詢是為了在提供名字時替換(或如果不存在則自動創建該行)姓氏。
REPLACE into `myTableName` (LastName, Username) VALUES ("Wilson", "jWilson") WHERE firstName = "John";
我期待此查詢修改的記錄John Brown來John Wilson和用戶名jBrown來jWilson。如果有名字的行John不存在,我也希望它創建一個新行的值John作為firstName和Wilson作為LastName,以及改變用戶名jWilson。
我知道我可以使用多個查詢來做到這一點,例如SELECT名字,INSERT如果它不存在,或者DELETE記錄,INSERT如果存在,則再次查詢,但是我有很多記錄我需要一次插入并希望在單個查詢。
我怎樣才能解決這個問題?
uj5u.com熱心網友回復:
為避免重復用戶名,您應該使用:
alter table `myTableName` modify column username char(64) unique;
替換(洗掉然后更新)到表中
REPLACE into `myTableName` (Username) VALUES (CONCAT(SUBSTR(firstname,0,1),lastname))) WHERE firstName = "John";
REPLACE 的作業方式與 INSERT 完全相同,但如果表中的舊行與 PRIMARY KEY 或 UNIQUE 索引的新行具有相同的值,則在插入新行之前洗掉舊行。
一旦它按您希望的方式作業,請洗掉 WHERE
您還可以使用INSERT ON DUPLICATE UPDATE
insert into user (firstname,lastname,username) values ("frank","our",lcase(concat(substr(firstname,1,1),lastname))) ON DUPLICATE KEY UPDATE username=lcase(concat(substr(firstname,1,1),lastname));
如果指定 ON DUPLICATE KEY UPDATE 子句并且要插入的行將導致 UNIQUE 索引或 PRIMARY KEY 中的重復值,則會發生舊行的 UPDATE。
要更新現有值,請使用 UPDATE
UPDATE `myTableName` SET username = LCASE(CONCAT(SUBSTR(firstname,0,1),lastname))) WHERE firstName = "John";
uj5u.com熱心網友回復:
一種執行此操作的hacky方法,因為您不想將unique約束添加到 first_name 列,即使您確定它會是唯一的,那就是獲取 firstName = 'John' 的行的 pKey,如果不存在的,使用 0 作為 pKey 代替讓 mysql 為您獲取下一個值:
INSERT INTO table_name
select (coalesce((select pKey from table_name where firstName = 'John'),
0)) as pKey,
'John' as firstName,
'Wilson' as lastName,
'jWilson' as userName
on duplicate key update lastName = 'Wilson', userName = 'jWilson';
小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/399481.html
上一篇:排除與另一行具有相似列的行
