我的MYSQL學習心得(八) 插入 更新 刪除

來源:互聯網
上載者:User

標籤:des   指定   inno   ignore   www   比較   std   刪除語句   mysql學習   

這一篇《我的MYSQL學習心得(八)》將會講解MYSQL的插入、更新和刪除語句

同樣的,只會講解跟SQLSERVER不同的地方

 

插入

將多行查詢結果插入到表中

文法

INSERT INTO table_name1(column_list1) SELECT (column_list2) FROM table_name2 WHERE (condition)

INSERT INTO SELECT 在SQLSERVER裡也是支援的

table_name1指定待插入資料的表;column_list1指定待插入表中要插入資料的哪些列;table_name2指定插入資料是從

哪個表中查詢出來的;column_list2指定資料來源表的查詢列,該列表必須和column_list1列表中的欄位個數相同,資料類型相同;

condition指定SELECT語句的查詢條件

 

從person_old表中查詢所有的記錄,並將其插入到person表

CREATE TABLE person (  id INT UNSIGNED NOT NULL AUTO_INCREMENT,  NAME CHAR(40) NOT NULL DEFAULT ‘‘,  age INT NOT NULL DEFAULT 0,  info CHAR(50) NULL,  PRIMARY KEY (id))CREATE TABLE person_old (  id INT UNSIGNED NOT NULL AUTO_INCREMENT,  NAME CHAR(40) NOT NULL DEFAULT ‘‘,  age INT NOT NULL DEFAULT 0,  info CHAR(50) NULL,  PRIMARY KEY (id))INSERT INTO person_oldVALUES (11,‘Harry‘,20,‘student‘),(12,‘Beckham‘,31,‘police‘)SELECT * FROM person_old

 可以看到,插入記錄成功,person_old表現在有兩條記錄。接下來將person_oldperson_old表中的所有記錄插入到person表

INSERT INTO person(id,NAME,age,info)SELECT id,NAME,age,info FROM person_old;SELECT * FROM person 

可以看到資料轉移成功,這裡的id欄位為自增的主鍵,在插入時要保證該欄位值的唯一性,如果不能確定,可以插入的時候忽略該欄位,

只插入其他欄位的值

如果再執行一次就會出錯

 

MYSQL和SQLSERVER的區別:

區別一

當要匯入的資料中有重複值的時候,MYSQL會有三種方案

方案一:使用 ignore 關鍵字
方案二:使用 replace into   mysql4.1之前只有replace into
方案三:ON DUPLICATE KEY UPDATE    mysql4.1之後引入on duplicate key update  替代replace into

第二和第三種方案這裡不作介紹,因為比較複雜,而且不符合要求,這裡只講第一種方案

TRUNCATE TABLE personTRUNCATE TABLE persona_old INSERT INTO person_oldVALUES (11,‘Harry‘,20,‘student‘),(12,‘Beckham‘,31,‘police‘)##注意下面這條insert語句是沒有ignore關鍵字的INSERT  INTO person(id,NAME,age,info)SELECT id,NAME,age,info FROM person_old;INSERT INTO person_old VALUES (13,‘kay‘,26,‘student‘)##注意下面這條insert語句是有ignore關鍵字的INSERT IGNORE INTO person(id,NAME,age,info)SELECT id,NAME,age,info FROM person_old;

 

可以看到插入成功

 

SQLSERVER

在SQLSERVER這邊,如果要忽略重複鍵,需要在建表的時候指定 WITH (IGNORE_DUP_KEY = ON) ON [PRIMARY] 

這樣在插入重複值的時候,SQLSERVER第一次會保留值,第二次發現有重複值的時候,SQLSERVER就會忽略掉

 

區別二

插入自增列時的區別

SQLSERVER需要使用 SET IDENTITY_INSERT 表名 ON 才能把自增欄位的值插入到表中,如果不加 SET IDENTITY_INSERT 表名 ON 

則在插入資料到表中時,不能指定自增欄位的值,則id欄位不能指定值,SQLSERVER會自動幫你自動增加一

INSERTINTO person(NAME,age,info) VALUES (‘feicy‘,33,‘student‘)

 

而MYSQL則不需要,而且自由度非常大

你可以將id欄位的值指定為NULL,MYSQL會自動幫你增一

INSERTINTO person(id,NAME,age,info) VALUES (NULL,‘feicy‘,33,‘student‘)

 

也可以指定值

INSERT IGNORE INTO person(id,NAME,age,info) VALUES (16,‘tom‘,88,‘student‘)

也可以不寫id的值,MYSQL會自動幫你增一

INSERT IGNORE INTO person(NAME,age,info) VALUES (‘amy‘,12,‘bb‘)

你可以指定id欄位的值也可以不指定,指定的時候只要當前id欄位列沒有你正在插入的那個值就可以,即沒有重複值就可以

自由度非常大,而且無須指定 SET IDENTITY_INSERT 表名 ON 選項

 

區別三

唯一索引的NULL值重複問題

MYSQL

在MYSQL中UNIQUE 索引將會對null欄位失效

insert into test(a) values(null) insert into test(a) values(null) 

上面的插入語句是可以重複插入的(聯合唯一索引也一樣)

SQLSERVER

SQLSERVER則不行

CREATE TABLE person (  id INT  NOT NULL IDENTITY(1,1),  NAME CHAR(40)  NULL DEFAULT ‘‘,  age INT NOT NULL DEFAULT 0,  info CHAR(50) NULL,  PRIMARY KEY (id))CREATE UNIQUE INDEX IX_person_unique ON [dbo].[person](name)INSERT INTO [dbo].[person]        ( [NAME], [age], [info] )VALUES  ( NULL, -- NAME - char(40)          1, -- age - int          ‘aa‘  -- info - char(50)          ),          ( NULL, -- NAME - char(40)          2, -- age - int          ‘bb‘  -- info - char(50)          )
訊息 2601,層級 14,狀態 1,第 1 行不能在具有唯一索引“IX_person_unique”的對象“dbo.person”中插入重複鍵的行。重複索引值為 (<NULL>)。語句已終止。

 

增強values子句

sqlserver  增強values子句

http://www.cnblogs.com/lyhabc/articles/3960374.htmlINSERT  INTO [dbo].[counttb]        ( [id] ,          [TESTDATE]        )VALUES  ( ( SELECT  a            FROM    [dbo].[aaa]            WHERE   [a] = 2          ) , -- id - int          GETDATE()  -- TESTDATE - datetime        )

 



mysql  子查詢

INSERT  INTO test        ( NAME ,          dd        )VALUES  ( ( SELECT  NAME            FROM    test1            WHERE   id = 2          ) , -- id - int          NOW()        )        SELECT * FROM testSELECT * FROM test1SQL 學習指南P172

 

更新

更新比較簡單,就不多說了

UPDATE person SET info =‘police‘ WHERE id BETWEEN 14 AND 17SELECT * FROM person

 

多表update
UPDATE BOOK,BOOK2 SET BOOK.`bookcount`=2 ,BOOK2.`bookcount`=3 
WHERE BOOK.`bookid`=1 AND BOOK2.`bookid`=1;

 

按排序更新

update book
set bookcount=2
where bookname in (‘ss‘)
order by bookid 
limit 10

刪除

刪除person表中一定範圍的資料

DELETE FROM  person  WHERE id BETWEEN 14 AND 17SELECT * FROM person

如果要刪除表的所有記錄可以使用下面的兩種方法

##方法一DELETE     FROM person##方法二TRUNCATE TABLE  person

跟SQLSERVER一樣,TRUNCATE TABLE會比DELETE FROM TABLE 快

MYISAM引擎下的測試結果,30行記錄

 

 

跟SQLSERVER一樣,執行完TRUNCATE TABLE後,自增欄位重新從一開始。

################################INSERT IGNORE INTO person(id,NAME,age,info)SELECT id,NAME,age,info FROM person_old;SELECT * FROM personTRUNCATE TABLE  personINSERT IGNORE INTO person(NAME,age,info) VALUES (‘amy‘,12,‘bb‘)SELECT * FROM person

當你剛剛truncate了表之後執行下面語句就會看到重新從一開始

SHOW TABLE STATUS LIKE ‘person‘

 

 

按排序刪除

delete from book
order by bookcount desc
limit 50

 

 

多表delete SQL學習指南 P268
DELETE book ,book2 FROM book ,book2
WHERE book.`bookid` >1 AND book2.`bookid`>1

 

 

如果是innodb引擎,並且有外鍵約束,將不能使用多表delete/update,因為innodb引擎不保證資料修改不破壞約束的執行順序

 

 

總結

這一節介紹了MYSQL裡的的插入、更新和刪除,並且比較了與SQLSERVER的區別,特別是MYSQL裡插入語句的靈活性

剛剛開始從SQLSERVER轉過來可能會有一些不適應

我的MYSQL學習心得(八) 插入 更新 刪除

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.