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?

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ść.


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 ...


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 

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


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).


-2

Odpowiednia składnia dla twojego zapytania to:

INSERT INTO courses (name, location, gid) 
SELECT (name, location, gid) 
FROM courses 
WHERE cid = $cid
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.