Wstaw (SQL)
Instrukcja SQL INSERT dodaje jeden lub więcej rekordów do dowolnej pojedynczej tabeli w relacyjnej bazie danych .
Podstawowa forma
Instrukcje wstawiania mają następującą postać:
WSTAW DO tabeli ( kolumna1 [, kolumna2 , kolumna3 ... ]) WARTOŚCI ( wartość1 [, wartość2 , wartość3 ... ])
Liczba kolumn i wartości musi być taka sama. Jeśli kolumna nie jest określona, używana jest wartość domyślna dla kolumny. Wartości określone (lub sugerowane) przez INSERT muszą spełniać wszystkie obowiązujące ograniczenia (takie jak klucze podstawowe , ograniczenia CHECK i ograniczenia NOT NULL ). Jeśli wystąpi błąd składni lub zostaną naruszone jakiekolwiek ograniczenia, nowy wiersz nie zostanie dodany do tabeli, a zamiast tego zostanie zwrócony błąd.
Przykład:
INSERT INTO phone_book ( nazwisko , numer ) WARTOŚCI ( 'John Doe' , '555-1212' );
Można również użyć skrótu, wykorzystując kolejność kolumn podczas tworzenia tabeli. Nie jest wymagane określanie wszystkich kolumn w tabeli, ponieważ wszystkie inne kolumny przyjmą wartość domyślną lub pozostaną puste :
WSTAW DO tabeli WARTOŚCI ( wartość1 , [ wartość2 , ... ])
Przykład wstawiania danych do 2 kolumn w tabeli phone_book i ignorowania innych kolumn, które mogą znajdować się za pierwszymi 2 w tabeli.
INSERT INTO phone_book VALUES ( 'John Doe' , '555-1212' );
Zaawansowane formularze
Wkładki wielorzędowe
Cechą SQL (od SQL-92 ) jest użycie konstruktorów wartości wierszy do wstawiania wielu wierszy jednocześnie w pojedynczej instrukcji SQL:
INSERT INTO tablename ( kolumna - a , [ kolumna - b , ...]) WARTOŚCI ( 'wartość-1a' , [ 'wartość-1b' , ...]), ( 'wartość-2a' , [ 'wartość- 2b' , ...]), ...
Ta funkcja jest obsługiwana przez IBM Db2 , SQL Server (od wersji 10.0 - tj. 2008), PostgreSQL (od wersji 8.2), MySQL , SQLite (od wersji 3.7.11) i H2 .
Przykład (zakładając, że „nazwa” i „numer” to jedyne kolumny w tabeli „telefoniczna”):
INSERT INTO phone_book VALUES ( 'John Doe' , '555-1212' ), ( 'Peter Doe' , '555-2323' );
co może być postrzegane jako skrót dla obu stwierdzeń
INSERT INTO phone_book VALUES ( 'John Doe' , '555-1212' ); INSERT INTO phone_book VALUES ( 'Peter Doe' , '555-2323' );
Należy zauważyć, że dwie oddzielne instrukcje mogą mieć różną semantykę (zwłaszcza w odniesieniu do wyzwalaczy instrukcji ) i mogą nie zapewniać takiej samej wydajności jak pojedyncza wstawka wielowierszowa.
Aby wstawić wiele wierszy w MS SQL, możesz użyć takiej konstrukcji:
INSERT INTO phone_book SELECT 'John Doe' , '555-1212' UNION ALL SELECT 'Peter Doe' , '555-2323' ;
Należy zauważyć, że nie jest to poprawna instrukcja SQL zgodnie ze standardem SQL ( SQL:2003 ) ze względu na niekompletną klauzulę subselect.
Aby zrobić to samo w Oracle, użyj tabeli DUAL , która zawsze składa się tylko z jednego wiersza:
WSTAW DO książki telefonicznej WYBIERZ „John Doe” , „555-1212” Z PODWÓJNEJ UNII WSZYSTKIE WYBIERZ „Peter Doe” , „555-2323” Z PODWÓJNEJ
Zgodna ze standardami implementacja tej logiki pokazuje następujący przykład lub jak pokazano powyżej:
INSERT INTO phone_book WYBIERZ „John Doe” , „555-1212” Z BOKU ( WARTOŚCI ( 1 ) ) AS t ( c ) UNION ALL SELECT „Peter Doe” , „555-2323” Z BOKU ( WARTOŚCI ( 1 ) ) AS t ( c )
Oracle PL/SQL obsługuje instrukcję INSERT ALL , w której wiele instrukcji wstawiania kończy się poleceniem SELECT :
WSTAW WSZYSTKO DO WARTOŚCI książki telefonicznej ( „John Doe” , „555-1212” ) DO WARTOŚCI książki telefonicznej ( „Peter Doe” , „555-2323” ) SELECT * FROM DUAL ;
W Firebird wstawianie wielu wierszy można osiągnąć w następujący sposób:
WSTAW DO książki telefonicznej ( nazwisko , numer ) WYBIERZ „John Doe” , „555-1212” Z UNII RDB$DATABASE ALL SELECT „Peter Doe” , „555-2323” Z RDB$DATABASE ;
Firebird ogranicza jednak liczbę wierszy, które można wstawić w ten sposób, ponieważ istnieje ograniczenie liczby kontekstów, których można użyć w jednym zapytaniu.
Kopiowanie wierszy z innych tabel
Instrukcji INSERT można również użyć do pobrania danych z innych tabel, zmodyfikowania ich w razie potrzeby i wstawienia bezpośrednio do tabeli. Wszystko to odbywa się w pojedynczej instrukcji SQL, która nie wymaga żadnego pośredniego przetwarzania w aplikacji klienckiej. Podselekcja jest używana zamiast VALUES . Podselekcja może zawierać sprzężenia, wywołania funkcji, a nawet może wysyłać zapytania do tej samej tabeli, do której wstawiane są dane. Logicznie rzecz biorąc, wybór jest oceniany przed rozpoczęciem rzeczywistej operacji wstawiania. Poniżej podano przykład.
INSERT INTO phone_book2 SELECT * FROM phone_book WHERE nazwa IN ( 'John Doe' , 'Peter Doe' )
Odmiana jest potrzebna, gdy niektóre dane z tabeli źródłowej są wstawiane do nowej tabeli, ale nie cały rekord. (Lub gdy schematy tabel nie są takie same).
INSERT INTO phone_book2 ( nazwisko , numer ) SELECT nazwisko , numer FROM phone_book GDZIE nazwisko IN ( 'John Doe' , 'Peter Doe' )
Instrukcja SELECT tworzy (tymczasową) tabelę, a schemat tej tabeli tymczasowej musi być zgodny ze schematem tabeli, do której wstawiane są dane.
Wartości domyślne
Możliwe jest wstawienie nowego wiersza bez podawania jakichkolwiek danych, przy użyciu wartości domyślnych dla wszystkich kolumn. Jednak niektóre bazy danych odrzucają instrukcję, jeśli nie podano żadnych danych, na przykład Microsoft SQL Server, iw takim przypadku można użyć słowa kluczowego DEFAULT .
WSTAW DO WARTOŚCI książki_telefonicznej ( DOMYŚLNE )
Czasami bazy danych obsługują również alternatywną składnię; na przykład MySQL umożliwia pominięcie DEFAULT , a T-SQL może używać DEFAULT VALUES zamiast VALUES(DEFAULT) . Słowo DEFAULT może być również użyte podczas normalnego wstawiania, aby jawnie wypełnić kolumnę przy użyciu wartości domyślnej tej kolumny:
WSTAW DO WARTOŚCI książki_telefonicznej ( DOMYŚLNE , '555-1212' )
To, co się dzieje, gdy kolumna nie określa wartości domyślnej, zależy od bazy danych. Na przykład MySQL i SQLite wypełnią pustą wartość (z wyjątkiem trybu ścisłego), podczas gdy wiele innych baz danych odrzuci instrukcję.
Odzyskanie klucza
Projektanci baz danych, którzy używają klucza zastępczego jako klucza podstawowego dla każdej tabeli, od czasu do czasu natkną się na scenariusz, w którym będą musieli automatycznie pobrać klucz podstawowy wygenerowany przez bazę danych z instrukcji SQL INSERT do użycia w innych instrukcjach SQL. Większość systemów nie zezwala na zwracanie przez instrukcje SQL INSERT danych wierszy. W związku z tym konieczne staje się wdrożenie obejścia w takich scenariuszach. Typowe implementacje obejmują:
- procedury składowanej specyficznej dla bazy danych , która generuje klucz zastępczy, wykonuje operację INSERT i ostatecznie zwraca wygenerowany klucz. Na przykład w Microsoft SQL Server klucz jest pobierany za pomocą SCOPE_IDENTITY() , podczas gdy w SQLite funkcja ta nosi nazwę last_insert_rowid() .
-
SELECT specyficznej dla bazy danych w tabeli tymczasowej zawierającej ostatnio wstawione wiersze. Db2 implementuje tę funkcję w następujący sposób:
SELECT * FROM NEW TABLE ( INSERT INTO phone_book VALUES ( 'Peter Doe' , '555-2323' ) ) AS t
- Db2 for z/OS implementuje tę funkcję w następujący sposób.
WYBIERZ PRACOWNIK , TYP ZATRUDNIENIA , DATA ZATRUDNIENIA Z TABELI KOŃCOWEJ ( WSTAWIĆ DO EMPSAMP ( NAZWA , WYNAGRODZENIE , NUMER DZIAŁU , POZIOM ) WARTOŚCI ( ' Mary Smith' , 35000. 00 , 11 , 'Associate' ) );
- Użycie instrukcji SELECT po instrukcji INSERT z funkcją specyficzną dla bazy danych, która zwraca wygenerowany klucz podstawowy dla ostatnio wstawionego wiersza. Na przykład LAST_INSERT_ID() dla MySQL .
- Użycie unikalnej kombinacji elementów z oryginalnego SQL INSERT w kolejnej instrukcji SELECT .
- Używanie identyfikatora GUID w instrukcji SQL INSERT i pobieranie go w instrukcji SELECT .
- Korzystanie z klauzuli OUTPUT w instrukcji SQL INSERT dla MS-SQL Server 2005 i MS-SQL Server 2008.
-
Używanie instrukcji INSERT z klauzulą RETURNING dla Oracle .
INSERT INTO phone_book VALUES ( 'Peter Doe' , '555-2323' ) ZWRACAJĄCY phone_book_id INTO v_pb_id
-
Używanie instrukcji INSERT z klauzulą RETURNING dla PostgreSQL (od wersji 8.2). Zwrócona lista jest identyczna z wynikiem INSERT .
-
Firebird ma tę samą składnię w instrukcjach Data Modification Language (DSQL); instrukcja może dodać co najwyżej jeden wiersz. W procedurach składowanych, wyzwalaczach i blokach wykonawczych (PSQL) stosowana jest wspomniana wyżej składnia Oracle.
WSTAW WARTOŚCI W KSIĄŻCE TELEFONICZNEJ ( 'Peter Doe' , '555-2323' ) POWRÓT identyfikator_książki telefonicznej
-
Firebird ma tę samą składnię w instrukcjach Data Modification Language (DSQL); instrukcja może dodać co najwyżej jeden wiersz. W procedurach składowanych, wyzwalaczach i blokach wykonawczych (PSQL) stosowana jest wspomniana wyżej składnia Oracle.
-
Użycie funkcji IDENTITY() w H2 zwraca ostatnią wstawioną tożsamość.
WYBIERZ TOŻSAMOŚĆ ();
Wyzwalacze
Jeśli wyzwalacze są zdefiniowane w tabeli, na której działa instrukcja INSERT , wyzwalacze te są oceniane w kontekście operacji. Wyzwalacze PRZED WSTAWIENIEM pozwalają na modyfikację wartości, które mają zostać wstawione do tabeli. Wyzwalacze AFTER INSERT nie mogą już modyfikować danych, ale mogą służyć do inicjowania działań na innych tabelach, na przykład w celu zaimplementowania mechanizmu audytu.
Linki zewnętrzne
- Instrukcja Oracle SQL INSERT (Oracle Database SQL Language Reference, 11g Release 2 (11.2) on oracle.com)
- Przykłady zapytań dołączających w programie Microsoft Access i składnia zapytań SQL INSERT
- Instrukcja MySQL INSERT (Podręcznik informacyjny MySQL 5.5)