Mysql,SqlServer,Oracleプライマリ・キーの自動増加の設定

10858 ワード

参考文献
http://blog.csdn.net/andyelvis/article/details/2446865
1、主キーを自動成長識別子タイプとして定義する
MySql
mysqlで、テーブルのプライマリ・キーをauto_に設定するとincrementタイプでは、データベースが自動的にプライマリ・キーに値を割り当てます.例:
create table customers(id int auto_increment primary key not null, name varchar(15));

insert into customers(name) values("name1"),("name2");

select id from customers;

以上のsql文はcustomersテーブルを作成し、2つのレコードを挿入し、挿入時にnameフィールドの値のみを設定します.最後のクエリー・テーブルのidフィールド.クエリーの結果は次のとおりです.

このようにidをauto_に設定するとincrementタイプでは、mysqlデータベースがプライマリ・キーに自動的にインクリメントされます.
Sql Server
MS SQLServerでは、テーブルのプライマリ・キーをidentityタイプに設定すると、データベースは自動的にプライマリ・キーに値を割り当てます.例:
create table customers(id int identity(1,1) primary key not null, name varchar(15));

insert into customers(name) values('name1'),('name2');

select id from customers;

注:sqlserverでは文字列は単一引用符で拡張され、mysqlでは二重引用符を使用できます.
クエリーの結果はmysqlと同じです.

このようにidをidentityタイプに設定すると、MS SQLServerデータベースは自動的にプライマリ・キーにインクリメントされます.identityには2つのパラメータがあり、1つ目のパラメータは開始値を表し、2つ目のパラメータは増分を表す.
PS:2012-7-13
以前はよくこのような問題に遭遇しましたが、自己成長列が1の記録を削除した後、再び挿入された記録自己成長列は2になりました.自己成長列1の記録を挿入することはできないと思います.今日同僚と話し合った時、SET IDENTITYを設定することでINSERT ON;自己成長をキャンセルし、データを挿入した後、この機能をオフにします.実験は以下の通りである.
use TESTDB2

--step1:   

create table customers(

    id int identity primary key not null,

    name varchar(15)

);



--step2:      

insert into customers(id,name) values(1,'name1');

--  :An explicit value for the identity column in table 'customers' can only be specified when a column list is used and IDENTITY_INSERT is ON.



--step3:         

SET IDENTITY_INSERT customers ON;



--step4:      ,     1 3。    

insert into customers(id,name) values(1,'name1');

insert into customers(id,name) values(3,'name1');



--step5:         2   。    

insert into customers(id,name) values(2,'name1');



--step6:      ,

--  :Violation of PRIMARY KEY constraint 'PK__customer__3213E83F00551192'. Cannot insert duplicate key in object 'dbo.customers'.

insert into customers(id,name) values(3,'name1');



--step7:  IDENTITY_INSERT

SET IDENTITY_INSERT customers OFF;

2、シーケンスから自動成長の識別子を取得する
Oracle
Oracleでは、各テーブルのプライマリ・キーに個別のシーケンスを作成し、このシーケンスから自動的に追加された識別子を取得してプライマリ・キーに値を割り当てることができます.たとえば、文はcustomerという名前を作成します.id_seqのシーケンスは,このシーケンスの開始値が1,増分が2である.
create sequence customer_id_seq increment by 2 start with 1

customerが定義されるとid_seqシーケンスは、シーケンスのcurvalプロパティとnextvalプロパティにアクセスできます.
  • curval:シーケンスの現在の値
  • を返します.
  • nextval:シーケンスの値を追加してから、シーケンス値
  • を返します.
    次のsql文は、customersテーブルを作成してから2つのレコードを挿入し、挿入時にidフィールドとnameフィールドの値を設定します.idフィールドの値はcustomer_から来ます.id_seqシーケンス.最後にcustomersテーブルのidフィールドをクエリーします.
    create table customers(id int primary key not null, name varchar(15));
    
    insert into customers values(customer_id_seq.nextval, 'name1');
    
    insert into customers values(customer_id_seq.nextval, 'name2');
    
    select id from customers;

    Oracleで上記の文を実行すると、クエリの結果は次のとおりです.

    トリガによるidフィールドの自動追加
    上記の挿入文から、customer_を毎回挿入する場合、id_seq.nextvalの値は非常に煩雑で面倒なので、トリガを使用してこの作業を完了することも考えられます.
    トリガtrg_の作成customers
    create or replace
    
    trigger trg_customers before insert on customers for each row 
    
    begin 
    
    select CUSTOMER_ID_SEQ.nextval into :new.id from dual; 
    
    end;

    レコードを挿入
    insert into customers(name) values('test'); 

    これは、このレコードがデータベースに挿入され、idが自己成長していることを発見します.
    Mysql,SqlServer,Oracle主键自动增长的设置