Mysql,SqlServer,Oracleプライマリ・キーの自動増加の設定
10858 ワード
参考文献
http://blog.csdn.net/andyelvis/article/details/2446865
1、主キーを自動成長識別子タイプとして定義する
MySql
mysqlで、テーブルのプライマリ・キーをauto_に設定するとincrementタイプでは、データベースが自動的にプライマリ・キーに値を割り当てます.例:
以上のsql文はcustomersテーブルを作成し、2つのレコードを挿入し、挿入時にnameフィールドの値のみを設定します.最後のクエリー・テーブルのidフィールド.クエリーの結果は次のとおりです.
このようにidをauto_に設定するとincrementタイプでは、mysqlデータベースがプライマリ・キーに自動的にインクリメントされます.
Sql Server
MS SQLServerでは、テーブルのプライマリ・キーをidentityタイプに設定すると、データベースは自動的にプライマリ・キーに値を割り当てます.例:
注:sqlserverでは文字列は単一引用符で拡張され、mysqlでは二重引用符を使用できます.
クエリーの結果はmysqlと同じです.
このようにidをidentityタイプに設定すると、MS SQLServerデータベースは自動的にプライマリ・キーにインクリメントされます.identityには2つのパラメータがあり、1つ目のパラメータは開始値を表し、2つ目のパラメータは増分を表す.
PS:2012-7-13
以前はよくこのような問題に遭遇しましたが、自己成長列が1の記録を削除した後、再び挿入された記録自己成長列は2になりました.自己成長列1の記録を挿入することはできないと思います.今日同僚と話し合った時、SET IDENTITYを設定することでINSERT ON;自己成長をキャンセルし、データを挿入した後、この機能をオフにします.実験は以下の通りである.
2、シーケンスから自動成長の識別子を取得する
Oracle
Oracleでは、各テーブルのプライマリ・キーに個別のシーケンスを作成し、このシーケンスから自動的に追加された識別子を取得してプライマリ・キーに値を割り当てることができます.たとえば、文はcustomerという名前を作成します.id_seqのシーケンスは,このシーケンスの開始値が1,増分が2である.
customerが定義されるとid_seqシーケンスは、シーケンスのcurvalプロパティとnextvalプロパティにアクセスできます. curval:シーケンスの現在の値 を返します. nextval:シーケンスの値を追加してから、シーケンス値 を返します.
次のsql文は、customersテーブルを作成してから2つのレコードを挿入し、挿入時にidフィールドとnameフィールドの値を設定します.idフィールドの値はcustomer_から来ます.id_seqシーケンス.最後にcustomersテーブルのidフィールドをクエリーします.
Oracleで上記の文を実行すると、クエリの結果は次のとおりです.
トリガによるidフィールドの自動追加
上記の挿入文から、customer_を毎回挿入する場合、id_seq.nextvalの値は非常に煩雑で面倒なので、トリガを使用してこの作業を完了することも考えられます.
トリガtrg_の作成customers
レコードを挿入
これは、このレコードがデータベースに挿入され、idが自己成長していることを発見します.
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
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プロパティにアクセスできます.
次の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が自己成長していることを発見します.