《Mysql學(xué)習(xí)與MSSQL對(duì)比學(xué)習(xí)MYSQL的心得(八)--插入 更新 刪除》要點(diǎn):
本文介紹了Mysql學(xué)習(xí)與MSSQL對(duì)比學(xué)習(xí)MYSQL的心得(八)--插入 更新 刪除,希望對(duì)您有用。如果有疑問(wèn),可以聯(lián)系我們。
同樣的,只會(huì)講解跟SQLSERVER不同的地方MYSQL數(shù)據(jù)庫(kù)
插入MYSQL數(shù)據(jù)庫(kù)
將多行查詢結(jié)果插入到表中MYSQL數(shù)據(jù)庫(kù)
語(yǔ)法MYSQL數(shù)據(jù)庫(kù)
INSERT INTO table_name1(column_list1) SELECT (column_list2) FROM table_name2 WHERE (condition)
INSERT INTO SELECT 在SQLSERVER里也是支持的MYSQL數(shù)據(jù)庫(kù)
table_name1指定待插入數(shù)據(jù)的表;column_list1指定待插入表中要插入數(shù)據(jù)的哪些列;table_name2指定插入數(shù)據(jù)是從MYSQL數(shù)據(jù)庫(kù)
哪個(gè)表中查詢出來(lái)的;column_list2指定數(shù)據(jù)來(lái)源表的查詢列,該列表必須和column_list1列表中的字段個(gè)數(shù)相同,數(shù)據(jù)類型相同;MYSQL數(shù)據(jù)庫(kù)
condition指定SELECT語(yǔ)句的查詢條件MYSQL數(shù)據(jù)庫(kù)
從person_old表中查詢所有的記錄,并將其插入到person表MYSQL數(shù)據(jù)庫(kù)
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_old VALUES (11,'Harry',20,'student'),(12,'Beckham',31,'police') SELECT * FROM person_old
MYSQL數(shù)據(jù)庫(kù)
?可以看到,插入記錄成功,person_old表現(xiàn)在有兩條記錄.接下來(lái)將person_oldperson_old表中的所有記錄插入到person表MYSQL數(shù)據(jù)庫(kù)
INSERT INTO person(id,NAME,age,info) SELECT id,NAME,age,info FROM person_old; SELECT * FROM person
MYSQL數(shù)據(jù)庫(kù)
可以看到數(shù)據(jù)轉(zhuǎn)移成功,這里的id字段為自增的主鍵,在插入時(shí)要保證該字段值的唯一性,如果不能確定,可以插入的時(shí)候忽略該字段,MYSQL數(shù)據(jù)庫(kù)
只插入其他字段的值MYSQL數(shù)據(jù)庫(kù)
如果再執(zhí)行一次就會(huì)出錯(cuò)MYSQL數(shù)據(jù)庫(kù)
MYSQL數(shù)據(jù)庫(kù)
MYSQL和SQLSERVER的區(qū)別:MYSQL數(shù)據(jù)庫(kù)
區(qū)別一MYSQL數(shù)據(jù)庫(kù)
當(dāng)要導(dǎo)入的數(shù)據(jù)中有重復(fù)值的時(shí)候,MYSQL會(huì)有三種方案MYSQL數(shù)據(jù)庫(kù)
方案一:使用 ignore 關(guān)鍵字
方案二:使用 replace into
方案三:ON DUPLICATE KEY UPDATEMYSQL數(shù)據(jù)庫(kù)
第二和第三種方案這里不作介紹,因?yàn)楸容^復(fù)雜,而且不符合要求,這里只講第一種方案MYSQL數(shù)據(jù)庫(kù)
TRUNCATE TABLE person TRUNCATE TABLE persona_old INSERT INTO person_old VALUES (11,'Harry',20,'student'),(12,'Beckham',31,'police') ##注意下面這條insert語(yǔ)句是沒(méi)有ignore關(guān)鍵字的 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語(yǔ)句是有ignore關(guān)鍵字的 INSERT IGNORE INTO person(id,NAME,age,info) SELECT id,NAME,age,info FROM person_old;
?MYSQL數(shù)據(jù)庫(kù)
MYSQL數(shù)據(jù)庫(kù)
可以看到插入成功MYSQL數(shù)據(jù)庫(kù)
SQLSERVERMYSQL數(shù)據(jù)庫(kù)
在SQLSERVER這邊,如果要忽略重復(fù)鍵,需要在建表的時(shí)候指定 WITH (IGNORE_DUP_KEY = ON) ON [PRIMARY]MYSQL數(shù)據(jù)庫(kù)
這樣在插入重復(fù)值的時(shí)候,SQLSERVER第一次會(huì)保留值,第二次發(fā)現(xiàn)有重復(fù)值的時(shí)候,SQLSERVER就會(huì)忽略掉MYSQL數(shù)據(jù)庫(kù)
區(qū)別二MYSQL數(shù)據(jù)庫(kù)
插入自增列時(shí)的區(qū)別MYSQL數(shù)據(jù)庫(kù)
SQLSERVER需要使用 SET IDENTITY_INSERT 表名 ON 才能把自增字段的值插入到表中,如果不加 SET IDENTITY_INSERT 表名 ONMYSQL數(shù)據(jù)庫(kù)
則在插入數(shù)據(jù)到表中時(shí),不能指定自增字段的值,則id字段不能指定值,SQLSERVER會(huì)自動(dòng)幫你自動(dòng)增加一MYSQL數(shù)據(jù)庫(kù)
INSERTINTO person(NAME,age,info) VALUES ('feicy',33,'student')
而MYSQL則不需要,而且自由度非常大MYSQL數(shù)據(jù)庫(kù)
你可以將id字段的值指定為NULL,MYSQL會(huì)自動(dòng)幫你增一MYSQL數(shù)據(jù)庫(kù)
INSERTINTO person(id,NAME,age,info) VALUES (NULL,'feicy',33,'student')
?MYSQL數(shù)據(jù)庫(kù)
也可以指定值MYSQL數(shù)據(jù)庫(kù)
INSERT IGNORE INTO person(id,NAME,age,info) VALUES (16,'tom',88,'student')
MYSQL數(shù)據(jù)庫(kù)
也可以不寫(xiě)id的值,MYSQL會(huì)自動(dòng)幫你增一MYSQL數(shù)據(jù)庫(kù)
INSERT IGNORE INTO person(NAME,age,info) VALUES ('amy',12,'bb')
MYSQL數(shù)據(jù)庫(kù)
你可以指定id字段的值也可以不指定,指定的時(shí)候只要當(dāng)前id字段列沒(méi)有你正在插入的那個(gè)值就可以,即沒(méi)有重復(fù)值就可以MYSQL數(shù)據(jù)庫(kù)
自由度非常大,而且無(wú)須指定 SET IDENTITY_INSERT 表名 ON 選項(xiàng)MYSQL數(shù)據(jù)庫(kù)
區(qū)別三MYSQL數(shù)據(jù)庫(kù)
唯一索引的NULL值重復(fù)問(wèn)題MYSQL數(shù)據(jù)庫(kù)
MYSQLMYSQL數(shù)據(jù)庫(kù)
在MYSQL中UNIQUE 索引將會(huì)對(duì)null字段失效MYSQL數(shù)據(jù)庫(kù)
insert into test(a) values(null) insert into test(a) values(null)
?
上面的插入語(yǔ)句是可以重復(fù)插入的(聯(lián)合唯一索引也一樣)MYSQL數(shù)據(jù)庫(kù)
SQLSERVERMYSQL數(shù)據(jù)庫(kù)
SQLSERVER則不行MYSQL數(shù)據(jù)庫(kù)
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,級(jí)別 14,狀態(tài) 1,第 1 行 不能在具有唯一索引“IX_person_unique”的對(duì)象“dbo.person”中插入重復(fù)鍵的行.重復(fù)鍵值為 (<NULL>). 語(yǔ)句已終止.
?
更新MYSQL數(shù)據(jù)庫(kù)
更新比較簡(jiǎn)單,就不多說(shuō)了MYSQL數(shù)據(jù)庫(kù)
UPDATE person SET info ='police' WHERE id BETWEEN 14 AND 17 SELECT * FROM person
MYSQL數(shù)據(jù)庫(kù)
刪除MYSQL數(shù)據(jù)庫(kù)
刪除person表中一定范圍的數(shù)據(jù)MYSQL數(shù)據(jù)庫(kù)
DELETE FROM person WHERE id BETWEEN 14 AND 17 SELECT * FROM person
MYSQL數(shù)據(jù)庫(kù)
如果要?jiǎng)h除表的所有記錄可以使用下面的兩種方法MYSQL數(shù)據(jù)庫(kù)
##方法一
DELETE???? FROM personMYSQL數(shù)據(jù)庫(kù)
##方法二
TRUNCATE TABLE? person
跟SQLSERVER一樣,TRUNCATE TABLE會(huì)比DELETE FROM TABLE 快MYSQL數(shù)據(jù)庫(kù)
MYISAM引擎下的測(cè)試結(jié)果,30行記錄MYSQL數(shù)據(jù)庫(kù)
MYSQL數(shù)據(jù)庫(kù)
MYSQL數(shù)據(jù)庫(kù)
MYSQL數(shù)據(jù)庫(kù)
?
跟SQLSERVER一樣,執(zhí)行完TRUNCATE TABLE后,自增字段重新從一開(kāi)始.MYSQL數(shù)據(jù)庫(kù)
################################ INSERT IGNORE INTO person(id,NAME,age,info) SELECT id,NAME,age,info FROM person_old; SELECT * FROM person TRUNCATE TABLE person INSERT IGNORE INTO person(NAME,age,info) VALUES ('amy',12,'bb') SELECT * FROM person
MYSQL數(shù)據(jù)庫(kù)
當(dāng)你剛剛truncate了表之后執(zhí)行下面語(yǔ)句就會(huì)看到重新從一開(kāi)始MYSQL數(shù)據(jù)庫(kù)
SHOW TABLE STATUS LIKE 'person'
MYSQL數(shù)據(jù)庫(kù)
總結(jié)MYSQL數(shù)據(jù)庫(kù)
這一節(jié)介紹了MYSQL里的的插入、更新和刪除,并且比較了與SQLSERVER的區(qū)別,特別是MYSQL里插入語(yǔ)句的靈活性MYSQL數(shù)據(jù)庫(kù)
剛剛開(kāi)始從SQLSERVER轉(zhuǎn)過(guò)來(lái)可能會(huì)有一些不適應(yīng)MYSQL數(shù)據(jù)庫(kù)
如有不對(duì)的地方,歡迎大家拍磚o(∩_∩)oMYSQL數(shù)據(jù)庫(kù)
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.snjht.com/jiaocheng/3564.html