行をデータベーステーブルに追加したいのですが、同じ一意のキーを持つ行が存在する場合、その行を更新します。
例えば:
insert into table (id, name, age) values(1, "A", 19)
一意のキーがid
で、データベースにの行があるとしid = 1
ます。その場合、その行をこれらの値で更新します。通常、これはエラーになります。
使用insert IGNORE
するとエラーは無視されますが、それでも更新されません。
行をデータベーステーブルに追加したいのですが、同じ一意のキーを持つ行が存在する場合、その行を更新します。
例えば:
insert into table (id, name, age) values(1, "A", 19)
一意のキーがid
で、データベースにの行があるとしid = 1
ます。その場合、その行をこれらの値で更新します。通常、これはエラーになります。
使用insert IGNORE
するとエラーは無視されますが、それでも更新されません。
回答:
使用する INSERT ... ON DUPLICATE KEY UPDATE
クエリ:
INSERT INTO table (id, name, age) VALUES(1, "A", 19) ON DUPLICATE KEY UPDATE
name="A", age=19
affected row count
、なぜ結果が2
出るのでしょうか?他の誰かがこの結果を出しましたか?(データは正しく更新されます:1行のみが更新されることを意味します)
ON DUPLICATE KEY UPDATE
。実際に何も更新されていない場合は0を報告します(通常のと同じUPDATE
)。
REPLACEを確認する
http://dev.mysql.com/doc/refman/5.0/en/replace.html
REPLACE into table (id, name, age) values(1, "A", 19)
これを試してください:
INSERT INTO table (id, name, age) VALUES (1, 'A', 19) ON DUPLICATE KEY UPDATE id = id + 1;
お役に立てれば。
これを試して:
INSERT INTO table (id,name,age) VALUES('1','Mohammad','21') ON DUPLICATE KEY UPDATE name='Mohammad',age='21'
注:
ここでidが主キーの場合、最初の挿入の後、id='1'
毎回挿入しようとするid='1'
と名前と年齢が更新され、以前の名前の年齢が変更されます。
INSERT IGNORE INTO table (id, name, age) VALUES (1, "A", 19);
INSERT INTO TABLE (id, name, age) VALUES(1, "A", 19) ON DUPLICATE KEY UPDATE NAME = "A", AGE = 19;
REPLACE INTO table (id, name, age) VALUES(1, "A", 19);
これらすべてのソリューションは、あなたの質問に関して機能します。
これらのステートメントについて詳しく知りたい場合は、このリンクにアクセスしてください
REPLACE
リンクされたドキュメントに記載されていません。
SQLiteを使用する場合:
REPLACE into table (id, name, age) values(1, "A", 19)
それid
が主キーである場合。または、別の行を挿入するだけです。INSERT(SQLite)を参照してください。
replace into
行うことはまさに「への挿入、または更新既存」です。@Owl
CREATE TRIGGER worklog_update AFTER INSERT ON worklog FOR EACH ROW REPLACE INTO support_time_monthly_hours ( ProjectID, monthTotalTime, Year, Month ) SELECT jiraissue.PROJECT, SUM(worklog.timeworked), YEAR(CURRENT_DATE()), MONTH(CURRENT_DATE()) FROM worklog, jiraissue WHERE worklog.issueid = jiraissue.ID AND jiraissue.PROJECT = (SELECT PROJECT FROM jiraissue WHERE NEW.issueid = jiraissue.ID ) AND worklog.startdate BETWEEN DATE_FORMAT(NOW() ,'%Y-%m-01 00:00:00') AND NOW();
ここでこのソリューションを探していたが、同じ構造の別のテーブルから更新した場合(私の場合は、WebサイトテストDBからライブDBへ):
INSERT live-db.table1
SELECT *
FROM test-db.table1 t
ON DUPLICATE KEY UPDATE
ColToUpdate1 = t.ColToUpdate1,
ColToUpdate2 = t.ColToUpdate2,
...
他の場所で述べたように、更新したい列のみをの後に含める必要がありますON DUPLICATE KEY UPDATE
。
INSERT
またはの列をリストする必要はありませんが、SELECT
おそらくより良い方法だと思います。
のnon-primary
基準/条件としてフィールドを作成したい場合はON DUPLICATE
、UNIQUE INDEX
そのテーブルにキーを作成してをトリガーできますDUPLICATE
。
ALTER TABLE `table` ADD UNIQUE `unique_index`(`name`);
また、2つのフィールドを組み合わせてテーブル上で一意にする場合は、最後のパラメーターにさらに追加することでこれを実現できます。
ALTER TABLE `table` ADD UNIQUE `unique_index`(`name`, `age`);
最初に、他の行name
と同じage
値を持つすべてのデータを必ず削除してください。
DELETE table FROM table AS a, table AS b WHERE a.id < b.id
AND a.name <=> b.name AND a.age <=> b.age;
その後、ON DUPLICATE
イベントをトリガーする必要があります。
INSERT INTO table (id, name, age) VALUES(1, "A", 19) ON DUPLICATE KEY UPDATE
name = VALUES(name), age = VALUES(age)
私の場合、以下のクエリを作成しましたが、最初のクエリでは、id
1が既に存在し、年齢がすでに存在している場合、その後、最初のクエリを作成した場合age
、の値はage
なしになります
REPLACE into table SET `id` = 1, `name` = 'A', `age` = 19
上記の問題を回避するために、以下のようなクエリを作成します
INSERT INTO table SET `id` = '1', `name` = 'A', `age` = 19 ON DUPLICATE KEY UPDATE `id` = "1", `name` = "A",`age` = 19
それがあなたを助けるかもしれません...