2012-11-20 28 views
27

Tôi nghĩ điều này sẽ đơn giản, nhưng dường như tôi không thể sử dụng AUTO_INCREMENT trong cơ sở dữ liệu db2 của mình. Tôi đã thực hiện một số tìm kiếm và mọi người dường như đang sử dụng "Được tạo theo mặc định", nhưng điều này không hiệu quả đối với tôi.Làm thế nào để AUTO_INCREMENT trong db2?

Nếu được, đây là bảng tôi muốn tạo với sid được tăng tự động.

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

Mọi con trỏ đều được đánh giá cao.

Trả lời

44

Bạn đang tìm kiếm được gọi là một cột IDENTITY:

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

Một chuỗi là một tùy chọn để làm điều này, nhưng bạn cần phải determine which one is proper cho tình hình cụ thể của bạn. Đọc thông tin này để biết thêm thông tin comparing sequences to identity columns.

+0

Cảm ơn Ian. Đây là nơi tôi bắt đầu. Tôi không chắc chắn tại sao, nhưng vì bất cứ lý do gì, phần "GENERATED ALWAYS" của truy vấn này không được nhận ra. Tôi nhận được lỗi thiếu parens quyền ... một chỉ số nó không recog các từ khóa. – Matt

+0

Bạn đang chạy phiên bản DB2 nào và trên nền tảng nào? –

+0

Bạn đang thiếu dấu phẩy ('','') sau khi khai báo chuỗi danh tính, nhưng nó hoạt động trên triển khai _my_ DB2 (tôi chưa bật nhật ký, vì vậy, tôi không thể khai báo khóa chính tại thời điểm này). –

5

Bạn sẽ phải tạo trường tự động tăng với đối tượng chuỗi (đối tượng này tạo chuỗi số).

Sử dụng như sau CREATE SEQUENCE cú pháp:

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

Đoạn mã trên tạo ra một đối tượng chuỗi gọi seq_person, mà bắt đầu với 1 và sẽ tăng lên 1. Nó cũng sẽ cache lên đến 10 giá trị cho hiệu suất. Tùy chọn bộ nhớ cache xác định số lượng giá trị chuỗi sẽ được lưu trữ trong bộ nhớ để truy cập nhanh hơn.

Để chèn một kỷ lục mới vào "Người" bảng, chúng ta sẽ phải sử dụng chức năng NEXTVAL (chức năng này lấy giá trị tiếp theo từ chuỗi seq_person):

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

Các câu lệnh SQL trên sẽ chèn một bản ghi mới vào bảng "Người". Cột "P_Id" sẽ được gán số tiếp theo từ chuỗi seq_person. Cột "FirstName" sẽ được đặt thành "Lars" và cột "LastName" sẽ được đặt thành "Monsen".

+0

Trong khi tôi cho rằng DB2 có trình tự, và đây là một cách sử dụng cho chúng (Nếu tôi nhớ đúng, các cột tự động có thể sử dụng cùng một loại đối tượng trong các trang bìa), DB2 không được liệt kê trên trang đó. .. Bạn chỉ cần sao chép các thiết lập Oracle? Hãy nhớ rằng có một số khác biệt lớn _other_ giữa Oracle và DB2 (những gì phụ thuộc vào phiên bản), vì vậy bạn không thể chỉ sao chép một cách mù quáng. (Tôi nghĩ rằng tôi đang tìm kiếm sự thiếu đức tin của người dân ở các trường học ở đây: không chỉ là họ thiếu DB2, mà còn cả postgreSQL và Derby, tất cả đều được sử dụng phổ biến ... có thể nhiều hơn Access) –

+0

@ Clockwork-Muse - bạn là chính xác trong khi loại xây dựng này sẽ làm việc trong db2 cú pháp là khác nhau. – Hogan

1

Đã thêm một vài tham số tùy chọn để tạo chuỗi "an toàn trong tương lai".

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

hi Nếu bạn vẫn không thể tạo cột là AUTO_INCREMENT khi tạo bảng.Là một công trình xung quanh đầu tiên tạo bảng đó là:

tạo sinh viên bảng ( nguyên sid NOT NULL varchar sName (30), PRIMARY KEY (sid) );

và sau đó một cách rõ ràng cố gắng để thay đổi cột bu sử dụng sau

alter làm sinh viên bảng thay đổi cột sid bộ Generated by default AS SẮC

Hoặc

thay đổi bảng sinh viên thay đổi cột sid set GENERATED BY DEFAULT NHƯ SAU (bắt đầu bằng 100)

Các vấn đề liên quan