Wstaw do tabeli MySQL lub zaktualizuj, jeśli istnieje

Chcę dodać wiersz do tabeli bazy danych, ale jeśli wiersz istnieje z tym samym unikalnym kluczem, chcę go zaktualizować.

Na przykład,

insert into table (id, name, age) values(1, "A", 19)

Załóżmy, że unikalnym kluczem jest id, a w mojej bazie danych znajduje się wiersz z id = 1. W takim przypadku chcę zaktualizować ten wiersz tymi wartościami. Zwykle daje to błąd. Jeśli użyję insert IGNORE zignoruje błąd, ale nadal nie zaktualizuje.

Author: Peter Mortensen, 2010-11-17

9 answers

Użycie INSERT ... ON DUPLICATE KEY UPDATE

QUERY:

INSERT INTO table (id, name, age) VALUES(1, "A", 19) ON DUPLICATE KEY UPDATE    
name="A", age=19
 1328
Author: Donnie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-12 05:53:39

Sprawdź zastąp

Http://dev.mysql.com/doc/refman/5.0/en/replace.html

REPLACE into table (id, name, age) values(1, "A", 19)
 195
Author: Martin Schapendonk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-17 14:15:24

Podczas wstawiania wsadowego należy stosować następującą składnię:

INSERT INTO TABLE (id, name, age) VALUES (1, "A", 19), (2, "B", 17), (3, "C", 22)
ON DUPLICATE KEY UPDATE
    name = VALUES (name),
    ...
 25
Author: Fabiano Souza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-27 12:51:30

Wypróbuj to:

INSERT INTO table (id, name, age) VALUES (1, 'A', 19) ON DUPLICATE KEY UPDATE id = id + 1;
Mam nadzieję, że to pomoże.
 22
Author: Luis Reyes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-17 14:17:32

Spróbuj tego:

INSERT INTO table (id,name,age) VALUES('1','Mohammad','21') ON DUPLICATE KEY UPDATE name='Mohammad',age='21'

Uwaga:
Tutaj jeśli id jest kluczem głównym, to po pierwszym wstawieniu z id='1' za każdym razem, gdy spróbujesz wstawić id='1' zaktualizuje nazwę i wiek, a poprzednia nazwa wiek ulegnie zmianie.

 16
Author: Abu Mohammad Rasel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-27 08:05:15
INSERT IGNORE INTO table (id, name, age) VALUES (1, "A", 19);

INTO TABLE (id, name, age) VALUES(1, "A", 19) ON DUPLICATE UPDATE SET NAME = "A", AGE = 19;

REPLACE INTO table (id, name, age) VALUES(1, "A", 19);

Wszystkie te rozwiązania będą działać w odniesieniu do twojego pytania.

Jeśli chcesz poznać szczegóły dotyczące tych oświadczeń odwiedź ten link

 8
Author: user2613580,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-03 15:18:17

Podczas korzystania z SQLite:

REPLACE into table (id, name, age) values(1, "A", 19)

Pod warunkiem, że id jest kluczem podstawowym. Albo po prostu wstawia kolejny rząd. Zobacz też INSERT (SQLite).

 7
Author: Dawn Song,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-08 13:08:52

Tylko dlatego, że Szukałem tego rozwiązania, ale do aktualizacji z innej identycznie skonstruowanej tabeli (w moim przypadku test DB na live DB):

INSERT  live-db.table1
SELECT  *
FROM    test-db.table1 t
ON DUPLICATE KEY UPDATE
        ColToUpdate1 = t.ColToUpdate1,
        ColToUpdate2 = t.ColToUpdate2,
        ...

Jak wspomniano w innym miejscu, tylko kolumny, które chcesz zaktualizować, muszą być dołączone po ON DUPLICATE KEY UPDATE.

Nie trzeba wymieniać kolumn w INSERT lub SELECT, choć zgadzam się, że to chyba lepsza praktyka.

 6
Author: SteveCinq,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-09 05:31:24
INSERT INTO table (id, name, age) VALUES (1, 'A', 19) ON DUPLICATE KEY UPDATE id = id + 1;

Nie zapomnij również o unikalnym ograniczeniu klucza.

ALTER TABLE `table` ADD UNIQUE `unique_key` ( `id` ) 
 -3
Author: Sudda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-12 11:21:54