標籤: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學習心得(八) 插入 更新 刪除