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.