行をデータベーステーブルに追加したいのですが、同じ一意のキーを持つ行が存在する場合、その行を更新します。
例えば:
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)
私の場合、以下のクエリを作成しましたが、最初のクエリでは、id1が既に存在し、年齢がすでに存在している場合、その後、最初のクエリを作成した場合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
それがあなたを助けるかもしれません...