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