WSTAW z WYBIERZ

287

Mam zapytanie, które wstawia za pomocą select:

INSERT INTO courses (name, location, gid) 
            SELECT name, location, gid 
              FROM courses 
             WHERE cid = $cid

Czy można wybrać tylko „nazwę, lokalizację” dla wstawki i ustawić gid na coś innego w zapytaniu?

Kyle
źródło

Odpowiedzi:

548

Tak, absolutnie, ale sprawdź swoją składnię.

INSERT INTO courses (name, location, gid)
SELECT name, location, 1
FROM   courses
WHERE  cid = 2

Oczywiście możesz umieścić stałą tego samego typu co gidna jej miejscu, a nie tylko 1. I właśnie wymyśliłem cidwartość.

Andrzej
źródło
2
Pracowałem, dziękuję bardzo. W przypadku opcji Select Select nawiasy nie są wymagane wokół nazw pól. Ale kiedy zaczynasz określać wartości nad zaznaczeniem, najwyraźniej potrzebujesz () wokół nazw pól.
Kyle
Zauważ, że nie możesz używać aliasów w klauzuli insert: „WSTAWIANIE DO kursów t1 (t1.name, t1.location, t1.gid) [...] zakończy się niepowodzeniem.
raphael
@Andrew, czy istnieje jakikolwiek sposób na zwrócenie tego samego wyboru bez następnego uruchomienia? jeśli chcę wstawić i uzyskać wynik tabeli kursów
TAHA SULTAN TEMURI
1
@TAHASULTANTEMURI Inne pytanie. Ale jeśli rozumiem, o co pytasz, SQL Server (nie to, o co prosiłem, ale czego używam w tych dniach) ma OUTPUTklauzulę , która pozwala ci umieścić wszystko, co wstawiłeś, również w innej tabeli. Nie sądzę, że MySQL ma odpowiednik. Możesz utworzyć tabelę tymczasową , wybrać tę tabelę, a następnie wypełnić coursestę tabelę, a następnie użyć tabeli tymczasowej do wszystkiego, czego potrzebujesz.
Andrew,
31

Tak to jest. Możesz pisać :

INSERT INTO courses (name, location, gid) 
SELECT name, location, 'whatever you want' 
FROM courses 
WHERE cid = $ci

lub możesz uzyskać wartości z innego połączenia wybranego ...

Dumitrescu Bogdan
źródło
INSERT INTO nazwa kursu, lokalizacja, gid WYBIERZ nazwę, lokalizację, '$ this-> gid' Z kursów GDZIE cid = $ cid - Pojawia się błąd: Wystąpił błąd w składni SQL; sprawdź instrukcję, która odpowiada twojej wersji serwera MySQL, czy jest odpowiednia składnia do użycia w pobliżu „name, location, gid SELECT name, location, '22' OD kursów GDZIE cid = 23 'w linii 1
Kyle
Myślę, że twoje pole gid jest liczbą całkowitą, więc: „22” musi wynosić 22. Zmień „$ this-> gid” o $ this-> gid
Alex Reche Martinez
22 i „22” nie powinny mieć znaczenia dla sql, ale wstawiam ciąg na wypadek, gdyby pole było podobne do unikalnego identyfikatora.
Dumitrescu Bogdan
8

Prawidłowa składnia: wybrana pisownia była niepoprawna

INSERT INTO courses (name, location, gid)
SELECT name, location, 'whatever you want' 
FROM courses 
WHERE cid = $ci 
RolandoMySQLDBA
źródło
5

Jasne, czego chcesz użyć do GID? wartość statyczna, PHP var, ...

Wartość statyczna 1234 może być następująca:

INSERT INTO courses (name, location, gid)
SELECT name, location, 1234
FROM courses
WHERE cid = $cid
klennepette
źródło
1

Oczywiście, że możesz.

Należy jednak zauważyć jedną rzecz: INSERT INTO SELECTinstrukcja kopiuje dane z jednej tabeli i wstawia ją do innej tabeli ORAZ wymaga, aby typy danych w tabelach źródłowej i docelowej były zgodne. Jeśli typy danych z podanych kolumn tabeli nie pasują (tj. Próbują wstawić VARCHARdo INTlub TINYINTdo INT) serwer MySQL wyrzuci SQL Error (1366).

Więc uważaj.

Oto składnia polecenia:

INSERT INTO table2 (column1, column2, column3)
SELECT column1, column2, column3 FROM table1
WHERE condition;

Uwaga dodatkowa: Istnieje sposób na obejście problemu wstawiania różnych typów kolumn za pomocą rzutowania w twoim SELECT, na przykład:

SELECT CAST('qwerty' AS CHAR CHARACTER SET utf8) COLLATE utf8_bin;

Ta konwersja ( CAST()jest synonimem CONVERT()) jest bardzo przydatna, jeśli tabele mają różne zestawy znaków w tej samej kolumnie tabeli (co może potencjalnie prowadzić do utraty danych, jeśli nie będzie właściwie obsługiwane).

Bud Damyanov
źródło
-2

Odpowiednia składnia dla twojego zapytania to:

INSERT INTO courses (name, location, gid) 
SELECT (name, location, gid) 
FROM courses 
WHERE cid = $cid
Martin Rafael Pérez Lara
źródło