程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> 與MSSQL比較進修MYSQL的心得(八)--拔出 更新 刪除

與MSSQL比較進修MYSQL的心得(八)--拔出 更新 刪除

編輯:MySQL綜合教程

與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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved