ホームページ >データベース >mysql チュートリアル >MySQL の最適化 - 追加、削除、変更の具体的な分析 (図)
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')
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 ('amy',12,'bb') SELECT * FROM person
当你刚刚truncate了表之后执行下面语句就会看到重新从一开始
SHOW TABLE STATUS LIKE 'person'
以上がMySQL の最適化 - 追加、削除、変更の具体的な分析 (図)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。