MySQL の最適化 - 追加、削除、変更の具体的な分析 (図)

黄舟
リリース: 2017-03-10 10:21:01
オリジナル
1056 人が閲覧しました

MySQL の最適化 - 追加、削除、および変更の具体的な分析 (図)

Insert

複数行のクエリ結果をテーブルに挿入します

構文

INSERT INTO table_name1(column_list1) SELECT (column_list2) FROM table_name2 WHERE (condition)
ログイン後にコピー

table_name1 は挿入されるテーブルを指定します; column_list1 は、テーブルにデータを挿入するテーブルを指定します; table_name2 は、挿入されたデータのクエリ元のテーブルを指定します; このリストには、同じ数のフィールドが必要です。 ;

condition は、column_list1 リストと同じデータ型です

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 テーブルには 2 つのレコードが追加されました。次に、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 の違い:

違い 1

インポートされるデータに重複する値がある場合、MYSQL には 3 つのオプションがあります

オプション 1:ignore キーワードを使用します
オプション 2: replace into を使用します
オプション 3: ON DUPLICATE KEY UPDATE

2 番目と 3 番目のオプションは、より複雑で要件を満たしていないため、ここでは紹介しません。ここでは最初のオプションについてのみ説明します

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)を指定する必要がありますオン [PRIMARY]

そのため、重複する値を挿入すると、SQLSERVER はその値を一度保持し、重複する値が 2 回目に見つかった場合、SQLSERVER はそれを無視します

違い2

自動インクリメント列を挿入する場合の違い

SQLSERVERはSETを使用する必要がありますIDENTITY_INSERTテーブル名ONは自動インクリメントフィールドの値をテーブルに挿入できます。 SET IDENTITY_INSERT テーブル名 ON

を追加しない場合、テーブル値にデータを挿入するときに自動インクリメント フィールドの値を指定できず、SQLSERVER は自動的に値を追加できません。あなたのため

INSERTINTO person(NAME,age,info) VALUES ('feicy',33,'student')
ログイン後にコピー

ですが、MYSQL はそれを必要とせず、自由度が非常に大きいです

ID フィールドの値を NULL として指定することができ、MYSQL が自動的に ID フィールドを追加します

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

オプション

違い 3

一意のインデックスでの NULL 値の重複の問題MYSQL

MYSQL では、NULL フィールドに対して UNIQUE インデックスが失敗します

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

Update は比較的簡単なので、これ以上は言いませんりー


删除

删除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 (&#39;amy&#39;,12,&#39;bb&#39;)

SELECT * FROM person
ログイン後にコピー


当你刚刚truncate了表之后执行下面语句就会看到重新从一开始

SHOW TABLE STATUS LIKE &#39;person&#39;
ログイン後にコピー


以上がMySQL の最適化 - 追加、削除、変更の具体的な分析 (図)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!