Próbuję wykonać następujące zapytanie:
INSERT INTO table_listnames (name, address, tele)
VALUES ('Rupert', 'Somewhere', '022')
WHERE NOT EXISTS (
SELECT name FROM table_listnames WHERE name='value'
);
Ale to zwraca błąd. Zasadniczo nie chcę wstawiać rekordu, jeśli pole „nazwa” rekordu już istnieje w innym rekordzie - jak sprawdzić, czy nowa nazwa jest unikalna?
Odpowiedzi:
W rzeczywistości nie sugeruję, abyś to zrobił, ponieważ
UNIQUE
indeks sugerowany przez Piskvor i innych jest znacznie lepszym sposobem na zrobienie tego, ale możesz zrobić to, co próbujesz:Wstaw rekord:
Spróbuj ponownie wstawić ten sam rekord:
Wstaw inny rekord:
I tak dalej...
Aktualizacja:
Aby zapobiec
#1060 - Duplicate column name
błędom w przypadku, gdy dwie wartości mogą być równe, musisz nazwać kolumny wewnętrznego SELECT:źródło
name
w tym przypadku), jeśli to w ogóle możliwe. Zauważ też, że możesz to zrobićSELECT 'John', 'Doe', '022' FROM table_listnames
zamiastSELECT * FROM (SELECT 'John', 'Doe', '022') AS tmp
- ale to zadziała tylko wtedy, gdytable_listnames
zawiera już jeden lub więcej wierszy. Wątpię, żeby prędkość była inna, więc prawdopodobnie nie stanowi to problemu.WHERE
Instrukcja należy doSELECT
zapytania. Zapytanie Select zwraca pojedynczy wiersz danych (dane są wstawiane) lub w ogóle nie ma danych (nic nie jest wstawiane)SELECT 'Humbert', 'Humbert', '1'
W wewnętrznej selekcji). OtrzymujęERROR 1060 (42S21): Duplicate column name
#1060 - Duplicate column name
. Znalazłeś rozwiązanie? Edycja: Znaleziono. Dodaj za każdą wartość AS:SELECT * FROM (SELECT 'Rupert' as name, 'Rupert' as friend, '022' as number) AS tmp
INSERT nie zezwala
WHERE
na składnię .Co możesz zrobić: utwórz
UNIQUE INDEX
pole, które powinno być unikalne (name
), a następnie użyj:INSERT
(i obsłużyć błąd, jeśli nazwa już istnieje)INSERT IGNORE
(które niepowiedzie się po cichuspowoduje ostrzeżenie (zamiast błędu), jeśli nazwa już istnieje)INSERT ... ON DUPLICATE KEY UPDATE
(który wykonaUPDATE
na końcu, jeśli nazwa już istnieje, zobacz dokumentację )źródło
mysql> show warnings\G
INSERT IGNORE
, odpowiada wyrażeniu regularnemu^Duplicate entry '.+' for key '.+'$
INSERT IGNORE
IMO.Pracował:
źródło
MySQL zapewnia bardzo urocze rozwiązanie:
Bardzo łatwy w użyciu, ponieważ zadeklarowałeś unikalny klucz podstawowy (tutaj o wartości 5).
źródło
Tutaj zapytanie mysql, które wstawia rekordy, jeśli nie istnieje, i zignoruje istniejące podobne rekordy.
źródło
INSERT IGNORE INTO `mytable` (`field0`, `field1`, `field2`) values ('2', 12345, 12678);
?INSERT [...] IGNORE INTO mytable VALUES ...
lubINSERT [...] IGNORE INTO mytable SET col_name={expr | DEFAULT},...
Możesz łatwo użyć następującego sposobu:
W ten sposób możesz wstawić dowolne nowe surowe dane, a jeśli masz zduplikowane dane, zamień konkretną kolumnę (najlepsze kolumny to znaczniki czasu).
Na przykład :
źródło
Jeśli naprawdę nie możesz uzyskać unikalnego indeksu na stole, możesz spróbować ...
źródło
Aby rozwiązać podobny problem, zmodyfikowałem tabelę, aby miała unikalną kolumnę. Korzystając z twojego przykładu, przy tworzeniu chciałbym mieć coś takiego:
a następnie użyj następującego zapytania podczas wstawiania do niego:
źródło
To zapytanie działa dobrze:
I możesz utworzyć tabelę za pomocą następującego zapytania:
Uwaga: Utwórz tabelę przy użyciu drugiego zapytania, zanim spróbujesz użyć pierwszego zapytania.
źródło
Brian Hooper: Prawie osiągnąłeś punkt, ale masz błąd w synatxie. Twoja wkładka nigdy nie będzie działać. Przetestowałem na mojej bazie danych i oto poprawna odpowiedź:
Dam ci mój przykład stołu. Wstaw jest prawie taki sam, jak napisał Bian Hooper, z tą różnicą, że wybrałem FROM DUAL ont z innej tabeli. Z poważaniem, Ivan
źródło
unknown table status: TABLE_TYPE
komunikaty, chociaż zapytanie dało wynik. Prawdopodobnie dlatego, że MySQL nie wymagaFROM DUAL
klauzuli?źródło
Wstawiasz nie aktualizuje wyniku. Możesz zdefiniować kolumnę nazwy w kolumnie głównej lub ustawić, aby była unikalna.
źródło
Miałem problem, a metoda zalecana przez Mike'a działała częściowo, miałem błąd Podpisz nazwę kolumny = „0” i zmieniłem składnię twojego zapytania w ten sposób`
Problem dotyczył nazw kolumn. sum3 było równe sum4, a mysql wyrzucił zdublowane nazwy kolumn, a ja napisałem kod w tej składni i działał idealnie,
źródło
Miałem podobny problem i musiałem wstawić wiele, jeśli nie istnieje. Tak więc z powyższych przykładów doszedłem do tej kombinacji ... jest tutaj na wypadek, gdyby ktoś jej potrzebował.
Uwaga: musiałem zdefiniować nazwę wszędzie, ponieważ wymagała tego MSSQL ... MySQL działa również z *.
MySQL: CREATE TABLE
names
(OID
int (11) NOT NULL AUTO_INCREMENT,name
varchar (32) COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (OID
), UNIQUE KEYname_UNIQUE
(name
)) ENGINE = InnoDB AUTO_INCREMENT = 1;lub
MSSQL: CREATE TABLE [nazwy] ([OID] INT IDENTITY (1, 1) NOT NULL, [name] NVARCHAR (32) NOT NULL, PRIMARY KEY CLUSTERED ([OID] ASC)); UTWÓRZ WYJĄTKOWY INDEKS NIEKLUSTEROWANY [nazwa_indeksu] NA [nazwy] ([nazwa] ASC);
źródło
Tego zapytania można użyć w kodzie PHP.
Mam kolumnę identyfikatora w tej tabeli, więc muszę sprawdzić, czy są duplikaty dla wszystkich kolumn oprócz tej kolumny identyfikatora:
a teraz nowy element zostanie dodany tylko w przypadku braku wiersza z wartościami skonfigurowanymi w
SET
ciąguźródło