2012-11-20 17 views
27

Myślałem, że to będzie proste, ale nie mogę użyć AUTO_INCREMENT w mojej bazie danych db2. Zrobiłem kilka wyszukiwania i ludzie wydają się używać "Generated by Default", ale to nie działa dla mnie.Jak AUTO_INCREMENT w db2?

Jeśli to pomaga, oto tabela, którą chcę utworzyć z automatycznym inkrementowaniem sid.

create table student(
     sid integer NOT NULL <auto increment?> 
     sname varchar(30), 
     PRIMARY KEY (sid) 
    ); 

Wszelkie wskazówki są mile widziane.

Odpowiedz

44

Szukacie nazywa kolumna tożsamości:

create table student (
    sid integer not null GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1) 
    ,sname varchar(30) 
    ,PRIMARY KEY (sid) 
); 

Sekwencja ma innej opcji dla tej operacji, ale trzeba determine which one is proper dla danej sytuacji. Przeczytaj to, aby uzyskać więcej informacji comparing sequences to identity columns.

+0

Dzięki Ian. To tam zacząłem. Nie jestem pewien dlaczego, ale z jakiegokolwiek powodu część "GENERATED ALWAYS" tego zapytania nie jest rozpoznawana. Otrzymuję komunikat o błędzie brakującym prawym parens ... wskaźnik nie rozpoznaje słów kluczowych. – Matt

+0

Jaką wersję DB2 używasz i na jakiej platformie? –

+0

Brakuje przecinków ('','') po deklaracji sekwencji tożsamości, ale w przeciwnym razie działa na _my_ DB2 (nie mam włączonego rejestrowania, więc nie mogę zadeklarować klucza podstawowego w tym momencie). –

5

Będziesz musiał utworzyć pole auto-inkrementacji z obiektem sekwencji (ten obiekt generuje sekwencję liczb).

Użyj następującego TWORZENIE SEKWENCJA składnia:

CREATE SEQUENCE seq_person 
    MINVALUE 1 
    START WITH 1 
    INCREMENT BY 1 
    CACHE 10 

Powyższy kod tworzy obiekt o nazwie seq_person sekwencji, który rozpoczyna się 1 i spowodują przyrost o 1. Będzie także buforować maksymalnie 10 wartości dla wydajności. Opcja pamięci podręcznej określa, ile wartości sekwencji będzie przechowywanych w pamięci, aby uzyskać szybszy dostęp.

Aby wstawić nowy rekord w tabeli „Osoby”, będziemy musieli skorzystać z funkcji NEXTVAL (ta funkcja pobiera następną wartość z sekwencji seq_person):

INSERT INTO Persons (P_Id,FirstName,LastName) 
    VALUES (seq_person.nextval,'Lars','Monsen') 

Instrukcja SQL powyżej byłby wstawić nowy rekord w tabeli "Osoby". Kolumnie "P_Id" zostanie przypisany następny numer z sekwencji seq_person. Kolumna "FirstName" zostanie ustawiona na "Lars", a kolumna "LastName" zostanie ustawiona na "Monsen".

+0

Podczas gdy przyznam, że DB2 ma sekwencje i jest to jeden z nich (jeśli dobrze pamiętam, kolumny z automatycznym generowaniem mogą używać tego samego typu obiektu pod okładkami), DB2 nie jest wymienione na tej stronie. .. Czy właśnie skopiowałeś konfigurację Oracle? Należy pamiętać, że istnieje kilka innych istotnych różnic między Oracle i DB2 (co zależy od wersji), więc nie można po prostu ślepo kopiować. (Wydaje mi się, że raczej brak wiary u ludzi w3schools jest uzasadniony: nie tylko brakuje im DB2, ale także postgreSQL i Derby, z których wszystkie są powszechnie używane ... może więcej niż Access) –

+0

@ Clockwork-Muse - masz rację, podczas gdy ten rodzaj konstrukcji będzie działał w db2, składnia jest inna. – Hogan

1

Dodano kilka opcjonalnych parametrów do tworzenia sekwencji "przyszłych bezpiecznych".

CREATE SEQUENCE <NAME> 
    START WITH 1 
    INCREMENT BY 1 
    NO MAXVALUE 
    NO CYCLE 
    CACHE 10; 
1

hi Jeśli nadal nie można utworzyć kolumny jako AUTO_INCREMENT podczas tworzenia tabeli.Jak obejść najpierw utworzyć tabelę, która jest:

tworzyć studenta tabeli ( sid całkowita nie NULL varchar sName (30), klucz podstawowy (SID) );

a następnie jawnie próbują zmieniać kolumny bu przy użyciu następujących

alter uczeń stół zmieniać kolumny sid zestaw generowane przez domyślną jeśli TOŻSAMOŚCI

Albo

alter table uczeń zmieniać kolumny zestaw sid GENERATED BY DEFAULT JAK TOŻSAMOŚĆ (start ze 100)