與MSSQL比較進修MYSQL的心得(八)--拔出 更新 刪除。本站提示廣大學習愛好者:(與MSSQL比較進修MYSQL的心得(八)--拔出 更新 刪除)文章只能為提供參考,不一定能成為您想要的結果。以下是與MSSQL比較進修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_old VALUES (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
計劃三:ON DUPLICATE KEY UPDATE
第二和第三種計劃這裡不作引見,由於比擬龐雜,並且不相符請求,這裡只講第一種計劃
TRUNCATE TABLE person TRUNCATE TABLE persona_old INSERT INTO person_old VALUES (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>)。 語句已終止。
更新
更新比擬簡略,就不多說了
UPDATE person SET info ='police' WHERE id BETWEEN 14 AND 17 SELECT * FROM person
刪除
刪除person表中必定規模的數據
DELETE FROM person WHERE id BETWEEN 14 AND 17 SELECT * 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 person TRUNCATE TABLE person INSERT IGNORE INTO person(NAME,age,info) VALUES ('amy',12,'bb') SELECT * FROM person
當你方才truncate了表以後履行上面語句就會看到從新從一開端
SHOW TABLE STATUS LIKE 'person'
總結
這一節引見了MYSQL裡的的拔出、更新和刪除,而且比擬了與SQLSERVER的差別,特殊是MYSQL裡拔出語句的靈巧性
方才開端從SQLSERVER轉過去能夠會有一些不順應
若有纰謬的處所,迎接年夜家拍磚o(∩_∩)o