国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > MySQL > 正文

與MSSQL對比學(xué)習(xí)MYSQL的心得(八)--插入 更新 刪除

2020-01-18 23:08:55
字體:
供稿:網(wǎng)友

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

插入

將多行查詢結(jié)果插入到表中

語法

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

INSERT INTO SELECT 在SQLSERVER里也是支持的

table_name1指定待插入數(shù)據(jù)的表;column_list1指定待插入表中要插入數(shù)據(jù)的哪些列;table_name2指定插入數(shù)據(jù)是從

哪個(gè)表中查詢出來的;column_list2指定數(shù)據(jù)來源表的查詢列,該列表必須和column_list1列表中的字段個(gè)數(shù)相同,數(shù)據(jù)類型相同;

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表現(xiàn)在有兩條記錄。接下來將person_oldperson_old表中的所有記錄插入到person表

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

可以看到數(shù)據(jù)轉(zhuǎn)移成功,這里的id字段為自增的主鍵,在插入時(shí)要保證該字段值的唯一性,如果不能確定,可以插入的時(shí)候忽略該字段,

只插入其他字段的值

如果再執(zhí)行一次就會出錯(cuò)

MYSQL和SQLSERVER的區(qū)別:

區(qū)別一

當(dāng)要導(dǎo)入的數(shù)據(jù)中有重復(fù)值的時(shí)候,MYSQL會有三種方案

方案一:使用 ignore 關(guān)鍵字
方案二:使用 replace into
方案三:ON DUPLICATE KEY UPDATE

第二和第三種方案這里不作介紹,因?yàn)楸容^復(fù)雜,而且不符合要求,這里只講第一種方案

TRUNCATE TABLE personTRUNCATE TABLE persona_old INSERT INTO person_oldVALUES (11,'Harry',20,'student'),(12,'Beckham',31,'police')##注意下面這條insert語句是沒有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語句是有ignore關(guān)鍵字的INSERT IGNORE INTO person(id,NAME,age,info)SELECT id,NAME,age,info FROM person_old;

 

可以看到插入成功

SQLSERVER

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

這樣在插入重復(fù)值的時(shí)候,SQLSERVER第一次會保留值,第二次發(fā)現(xiàn)有重復(fù)值的時(shí)候,SQLSERVER就會忽略掉

區(qū)別二

插入自增列時(shí)的區(qū)別

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

則在插入數(shù)據(jù)到表中時(shí),不能指定自增字段的值,則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字段的值也可以不指定,指定的時(shí)候只要當(dāng)前id字段列沒有你正在插入的那個(gè)值就可以,即沒有重復(fù)值就可以

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

區(qū)別三

唯一索引的NULL值重復(fù)問題

MYSQL

在MYSQL中UNIQUE 索引將會對null字段失效

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

 
上面的插入語句是可以重復(fù)插入的(聯(lián)合唯一索引也一樣)

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,狀態(tài) 1,第 1 行不能在具有唯一索引“IX_person_unique”的對象“dbo.person”中插入重復(fù)鍵的行。重復(fù)鍵值為 (<NULL>)。語句已終止。

 
更新

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

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

刪除

刪除person表中一定范圍的數(shù)據(jù)

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

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

##方法一
DELETE     FROM person

##方法二
TRUNCATE TABLE  person
跟SQLSERVER一樣,TRUNCATE TABLE會比DELETE FROM TABLE 快

MYISAM引擎下的測試結(jié)果,30行記錄

 
跟SQLSERVER一樣,執(zhí)行完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

當(dāng)你剛剛truncate了表之后執(zhí)行下面語句就會看到重新從一開始

SHOW TABLE STATUS LIKE 'person'

總結(jié)

這一節(jié)介紹了MYSQL里的的插入、更新和刪除,并且比較了與SQLSERVER的區(qū)別,特別是MYSQL里插入語句的靈活性

剛剛開始從SQLSERVER轉(zhuǎn)過來可能會有一些不適應(yīng)

如有不對的地方,歡迎大家拍磚o(∩_∩)o

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 司法| 延庆县| 台南市| 莱芜市| 嘉峪关市| 靖边县| 漾濞| 邹城市| 且末县| 平邑县| 津市市| 玛曲县| 和田市| 陇南市| 报价| 辰溪县| 潢川县| 南华县| 临泉县| 金湖县| 太保市| 吴江市| 迁西县| 南川市| 长葛市| 丰镇市| 正阳县| 石泉县| 泽普县| 萨嘎县| 新民市| 浮梁县| 田林县| 兰坪| 彰化县| 民县| 徐汇区| 石渠县| 普洱| 北安市| 安乡县|