Mam trudności z utworzeniem warunkowej WSTAWY
Mam x_table z kolumnami (instancja, użytkownik, pozycja), w których identyfikator instancji jest unikalny. Chcę wstawić nowy wiersz tylko wtedy, gdy użytkownik nie ma już podanej pozycji.
Na przykład próba wstawienia instance = 919191 user = 123 item = 456
Insert into x_table (instance, user, item) values (919191, 123, 456)
ONLY IF there are no rows where user=123 and item=456
Każda pomoc lub wskazówka we właściwym kierunku byłaby bardzo mile widziana.
źródło
dual
w tym przypadku musi być utworzona wcześniej, czy jest to jakaś specjalna „tymczasowa” tabela utworzona przez zapytanie w celu użycia samego zapytania?dual
, musisz go utworzyć.CREATE TABLE dual ( dummy CHAR(1) DEFAULT 'x' NOT NULL CHECK (dummy = 'x') PRIMARY KEY ); INSERT INTO dual VALUES('x'); REVOKE ALL ON dual FROM PUBLIC; GRANT SELECT ON dual TO PUBLIC;
SELECT COUNT(*) FROM dual
zawsze otrzymujesz1
iSELECT 'foo' FROM dual
zawsze otrzymujeszfoo
. Ale nie możeszSELECT * FROM dual
i nie możesz,DESCRIBE dual
ani nic takiego. Nie sprawdzałem, ale nie sądzę też, że możesz cofnąć uprawnieniadual
. Więc warto zwrócić uwagę, że działa zgodnie z oczekiwaniami ... z wyjątkiem, gdy nie robi;)Możesz również użyć tego,
INSERT IGNORE
który po cichu ignoruje wstawianie zamiast aktualizowania lub wstawiania wiersza, gdy masz unikalny indeks na (użytkownik, element).Zapytanie będzie wyglądać następująco:
Możesz dodać unikalny indeks za pomocą
CREATE UNIQUE INDEX user_item ON x_table (user, item)
.źródło
Czy kiedykolwiek próbowałeś czegoś takiego?
źródło
Z
UNIQUE(user, item)
, wykonaj następujące czynności:user=123
bit jest „no-op”, aby dopasować składnięON DUPLICATE
klauzuli bez faktycznie robi nic, gdy istnieją duplikaty.źródło
Jeśli nie chcesz ustawiać unikalnego ograniczenia, działa to jak urok:
Mam nadzieję, że to pomoże !
źródło
To czego chcesz
INSERT INTO table (...) SELECT ... WHERE ...
. z podręcznika MySQL 5.6 .W twoim przypadku jest to:
A może, ponieważ nie używasz skomplikowanej logiki do określenia, czy uruchomić,
INSERT
czy nie, możesz po prostu ustawićUNIQUE
klucz na kombinacji tych dwóch kolumn, a następnie użyćINSERT IGNORE
.źródło
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where...
Wciąż dostaję (działa 5.6.34)from dual
wcześniejwhere
.FROM DUAL
jest ustawieniem domyślnym, jeśli nie było odwołań do żadnych tabel ( zobacz tę dokumentację ).Jeśli dodasz ograniczenie, które (x_table.user, x_table.item) jest unikatowe, wstawienie kolejnego wiersza z tym samym użytkownikiem i elementem zakończy się niepowodzeniem.
na przykład:
źródło
Chociaż dobrze jest sprawdzić, czy przed wstawieniem danych nie ma duplikatów, sugeruję, aby umieścić unikalne ograniczenie / indeks na swoich kolumnach, aby przez pomyłkę nie można było wstawić zduplikowanych danych.
źródło
Aby rozwiązać problem, możesz skorzystać z następującego rozwiązania:
źródło
Nieznaczna modyfikacja odpowiedzi Alexa, możesz też po prostu odwołać się do istniejącej wartości kolumny:
źródło
Więc ten oznacza PostgreSQL
źródło
Składnia może się różnić w zależności od Twojej bazy danych ...
źródło