修改MySQL中的數據

一:insert語句html

1.介紹mysql

  在執行插入語句前,須要具備執行INSERT語句的INSERT權限。sql

  

2.準備環境數據庫

  

 

3.簡單insert語句安全

  

 

4.插入多行服務器

  在這種形式中,每行的值列表用逗號分隔。yii

  

  若是爲表中的全部列指定相應列的值,則能夠忽略INSERT語句中的列列表性能

  

 

5.具備SELECT子句的MySQL INSERTui

  可使用INSERTSELECT子句徹底或部分複製表url

  

  

 

6.INSERT與ON DUPLICATE KEY UPDATE

  若是新行違反主鍵(PRIMARY KEY)UNIQUE約束,MySQL會發生錯誤。

  可是,若是在INSERT語句中指定ON DUPLICATE KEY UPDATE選項,MySQL將插入新行或使用新值更新原行記錄

  

  =》

  

  =》問題

  這個取決與on duplicate key update後面的值,若是id是2,由於後面加1,id的值變成3,在表中id=3是有的,因此還會繼續報錯。

 

二:insert ignore

1.介紹  

  當使用INSERT語句向表中添加一些行數據而且在處理期間發生錯誤時,INSERT語句將被停止,並返回錯誤消息。所以,可能不會向表中沒有插入任何行。

  可是,若是使用INSERT INGORE語句,則會忽略致使錯誤的行,並將其他行插入到表中。

  請注意,IGNORE子句是MySQL對SQL標準的擴展。

  因此當使用INSERT IGNORE語句來執行插入數據時,MySQL只發出警告而不是發出錯誤,以防發生錯誤退出其它數據沒法插入。

 

2.準備數據

  UNIQUE約束確保電子郵件列中不存在重複的電子郵件。

  

 

3.示例

  先插入一條記錄

  

  使用ignore:

  

  結果:

  

 

4.strict模式

  當STRICT模式打開時,若是您嘗試將無效值插入到表中,MySQL將返回錯誤並停止INSERT語句。

  可是,若是使用INSERT IGNORE語句,則MySQL將發出警告而不是錯誤。 此外,它將嘗試調整值以使其在插入表以前有效。

  說明:

    例如表中的字段的長度限制是6.

    當數據插入的時候是7。

    不會報錯,只會將字符串截取,剩下6個字符被插入。

 

三:Update語句

1.介紹  

  使用UPDATE語句來更新表中的現有數據。也可使用UPDATE語句來更改表中單個行,一組行或全部行的列值。 

  • 首先,在UPDATE關鍵字後面指定要更新數據的表名。
  • 其次,SET子句指定要修改的列和新值。要更新多個列,請使用以逗號分隔的列表。以字面值,表達式或子查詢的形式在每列的賦值中來提供要設置的值。
  • 第三,使用WHERE子句中的條件指定要更新的行。WHERE子句是可選的。 若是省略WHERE子句,則UPDATE語句將更新表中的全部行。

  支持的修飾符:

  • LOW_PRIORITY修飾符指示UPDATE語句延遲更新,直到沒有從表中讀取數據的鏈接。 LOW_PRIORITY對僅使用表級定的存儲引擎(例如MyISAMMERGEMEMORY)生效。
  • 即便發生錯誤,IGNORE修飾符也可使UPDATE語句繼續更新行。致使錯誤(如重複鍵衝突)的行不會更新。

   

2.示例

  使用yiibaidb數據庫中的emplee表。

  

  

  修改數據:

  

  驗證數據

  

 

3.update多列

  要更新多列中的值,須要在SET子句中指定分配。

  

 

四:update join

1.介紹

  使用MySQL UPDATE JOIN語句來執行跨表更新。

  

 

2.相同的意思的語句

  在這個UPDATE語句與具備隱式INNER JOIN子句的UPDATE JOIN工做相同

  

 

3.準備數據

 1 CREATE DATABASE IF NOT EXISTS empdb;  2 
 3 USE empdb;  4 -- create tables
 5 CREATE TABLE merits (  6     performance INT(11) NOT NULL,  7     percentage FLOAT NOT NULL,  8     PRIMARY KEY (performance)  9 ); 10 
11 CREATE TABLE employees ( 12     emp_id INT(11) NOT NULL AUTO_INCREMENT, 13     emp_name VARCHAR(255) NOT NULL, 14     performance INT(11) DEFAULT NULL, 15     salary FLOAT DEFAULT NULL, 16     PRIMARY KEY (emp_id), 17     CONSTRAINT fk_performance FOREIGN KEY (performance) 18         REFERENCES merits (performance) 19 ); 20 -- insert data for merits table
21 INSERT INTO merits(performance,percentage) 22 VALUES(1,0), 23       (2,0.01), 24       (3,0.03), 25       (4,0.05), 26       (5,0.08); 27 -- insert data for employees table
28 INSERT INTO employees(emp_name,performance,salary) 29 VALUES('Mary Doe', 1, 50000), 30       ('Cindy Minsu', 3, 65000), 31       ('Sue Greenspan', 4, 75000), 32       ('Grace Dell', 5, 125000), 33       ('Nancy Johnson', 3, 85000), 34       ('John Doe', 2, 45000), 35       ('Lily Bush', 3, 55000);

 

4.INNER JOIN子句的示例  

  假設想根據員工的工做表現來調整員工的工資。

  所以,優勢百分比存儲在merits表中,您必須使用UPDATE INNER JOIN語句根據存儲在merits表中的百分比來調整employees表中員工的工資。

  

 

5.具備LEFT JOIN的MySQL UPDATE JOIN示例

  假設公司又僱用了兩名新員工:

  

  由於這些員工是新員工,因此他們的績效(performance)數據不可用或爲NULL。如今 employees表中的數據。

  這時:

  要計算新員工的工資,不能使用UPDATE INNER JOIN語句,由於它們的績效數據在merits表中不可用。

  要使用UPDATE LEFT JOIN來實現了。

  當UPDATE LEFT JOIN語句在另外一個表中沒有相應行時,就會更新表中的一行。

  作法:

    您可使用如下語句將新僱員的工資增長1.5%。

    

 

五:delete語句

1.介紹

  使用MySQL DELETE語句從單個表中刪除數據。

  

2.示例

  

  

 

3.與limit結合

  若是要限制要刪除的行數,則使用LIMIT子句。

  這個時候會刪除開始的m行。

  

 

六:on delete cascade語句

1.介紹

  使用MySQL ON DELETE CASCADE引用操做來執行外鍵從多個相關表中刪除數據。

  ON DELETE CASCADE對於外鍵的引用操做,能夠實如今從父表中刪除數據時自動刪除子表中的數據。

  ON DELETE CASCADE僅支持使用存儲引擎支持外鍵(如InnoDB)的表上工做。 某些表類型不支持諸如MyISAM的外鍵,所以應該在使用MySQL ON DELETE CASCADE引用操做的表上選擇適當的存儲引擎。

 

2.需求

  假設有兩張表:建築物(buildings)和房間(rooms)。 在這個數據庫模型中,每一個建築物都有一個或多個房間。 

  

  當咱們從buildings表中刪除一行時,還要刪除rooms表中引用建築物表中行的行。

 

3.準備數據

 1 USE testdb;  2 
 3 CREATE TABLE buildings (  4     building_no INT PRIMARY KEY AUTO_INCREMENT,  5     building_name VARCHAR(255) NOT NULL,  6     address VARCHAR(255) NOT NULL
 7 )ENGINE=InnoDB DEFAULT CHARSET=utf8;  8 
 9 CREATE TABLE rooms ( 10     room_no INT PRIMARY KEY AUTO_INCREMENT, 11     room_name VARCHAR(255) NOT NULL, 12     building_no INT NOT NULL, 13     FOREIGN KEY (building_no) 14         REFERENCES buildings (building_no) 15         ON DELETE CASCADE
16 )ENGINE=InnoDB DEFAULT CHARSET=utf8; 17 
18 INSERT INTO buildings(building_name,address) 19 VALUES('海南大廈','海口市國興大道1234號'), 20       ('萬達水城','海口市大同路1200號'); 21 
22 INSERT INTO rooms(room_name,building_no) 23 VALUES('Amazon',1), 24       ('War Room',1), 25       ('Office of CEO',1), 26       ('Marketing',2), 27       ('Showroom',2);

 

4.示例

  DELETE FROM buildings WHERE building_no = 2;

  

 

5.查找受MySQL ON DELETE CASCADE操做影響的表的技巧

  有時,當要從表中刪除數據時,知道哪一個表受到MySQL ON DELETE CASCADE參考操做的影響是有用的。 可從information_schema數據庫中的referential_constraints表中查詢此數據。

  

  

 

七:delete join

1.介紹

  使用MySQL DELETE JOIN語句來從多個表中刪除數據。

  

 

2.示例

  

  每一個用戶有多個訂單,每一個訂單屬於一個惟一的用戶。

  示例一:

  可使用DELETE語句與LEFT JOIN子句來清理客戶數據。 如下聲明刪除未下訂單的客戶:

  

 

八:replace語句

1.介紹

  REPLACE語句是標準SQL的MySQL擴展。 MySQL REPLACE語句的工做原理以下:

  • 若是給定行數據不存在,那麼MySQL REPLACE語句會插入一個新行
  • 若是給定行數據存在,則REPLACE語句首先刪除舊行,而後插入一個新行。 在某些狀況下,REPLACE語句僅更新現有行。

  要使用MySQL REPLACE語句,至少須要具備INSERTDELETE權限。

  MySQL使用PRIMARY KEYUNIQUE KEY索引來要肯定表中是否存在新行。

 

 2.準備數據

USE testdb; CREATE TABLE cities ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), population INT NOT NULL ); INSERT INTO cities(name,population) VALUES('New York',8008278), ('Los Angeles',3694825), ('Shanghai',1923400);

 

3.示例

  如今name列爲NULL。 您可能指望name列的值保持不變。可是,REPLACE語句不這樣作。

  

  

 

4.示例二

  

  

 

5.注意:

  請注意,沒有出如今REPLACE語句中的列將使用默認值插入相應的列。

   若是列具備NOT NULL屬性而且沒有默認值,而且您若是沒有在REPLACE語句中指定該值,則MySQL將引起錯誤。這是REPLACEINSERT語句之間的區別。

 

6.對於有update意思的replace的其餘寫法。

  請注意,REPLACE語句中沒有WHERE子句

  

  例如:

  

 

7.注意點

  • 若是您開發的應用程序不只支持MySQL數據庫,並且還支持其餘關係數據庫管理系統(RDBMS),則應避免使用REPLACE語句,由於其餘RDBMS可能不支持。代替的做法是在事務中使用DELETE和INSERT語句的組合。

  • 若是在具備觸發器的表中使用了REPLACE語句,而且發生了重複鍵錯誤的刪除,則觸發器將按如下順序觸發:在刪除前刪除,刪除以後,刪除後,若是REPLACE語句刪除當前 行並插入新行。 若是REPLACE語句更新當前行,則觸發BEFORE UPDATEAFTER UPDATE觸發器。

 

九:Prepared語句

1.介紹  

  以前的MySQL版本4.1,查詢以文本格式發送到MySQL服務器。

  以後,MySQL服務器使用文本協議將數據返回給客戶端。MySQL必須徹底解析查詢,並將結果集轉換爲字符串,而後再將其返回給客戶端。

  文本協議具備嚴重的性能問題。

  爲了解決這個問題,MySQL自版本4.1以來添加了一個名爲prepare語句的來實現一些新功能。

  prepare語句利用客戶端/服務器二進制協議。 它將包含佔位符(?)的查詢傳遞給MySQL服務器。

 

2.說明

  

  當MySQL使用不一樣的productcode值執行此查詢時,沒必要徹底解析查詢。

   所以,這有助於MySQL更快地執行查詢,特別是當MySQL屢次執行查詢時。

  由於prepare語句使用佔位符(?),這有助於避免SQL注入的問題,從而使您的應用程序更安全一些。

 

3.語法

  

 

4.示例

  

  

相關文章
相關標籤/搜索