web-dev-qa-db-ja.com

IDENTITY列が1つしかないテーブルに行を挿入する

主キーであるadminId列が1つだけのテーブル管理者がいます。ビジネスルールのため、このようにしなければなりません。

このようなテーブルに値を挿入するストアドプロシージャをどのように作成できるかを一度理解したいと思います。私はSQL ServerとT-SQLを使用しており、SCOPE_IDENTITY()を使用しようとしましたが、テーブルのINSERT_IDENTITYがfalseまたはoffであるため機能しません。

新しい行を挿入できるようにするためだけに、ダミー値を挿入したくないのです。ありがとう!

75
Phil

IDENTITYである列が1つある場合は、これを実行してください

INSERT MyTable DEFAULT VALUES;  --allows no column list. The default will be the IDENTITY
SELECT SCOPE_IDENTITY();

IDがない場合、設定できますか?これが最良の方法です。上記のSQLを使用します。

そうでない場合は、新しい行を挿入します

INSERT MyTable (admidid)
OUTPUT INSERTED.admidid --returns result to caller
SELECT ISNULL(MAX(admidid), 0) + 1 FROM MyTable

ノート:

  • 高負荷では、MAXソリューションが重複して失敗する場合があります
  • SCOPE_IDENTITYはafter事実であり、以前ではありません
  • SCOPE_IDENTITYは、IDENTITY列でのみ機能します。 IDENT_CURRENTを使用して任意の白痴
  • 出力節は、MAXソリューションのSCOPE_IDENTITYを置き換えます
131
gbn

SelectステートメントにIDENTITY_INSERTを追加する必要があります。

SET IDENTITY_INSERT MyTable ON

INSERT INTO MyTable
(AdminCol)

SELECT AdminColValue

 FROM Tableb

完了したら、忘れないようにしてください

SET IDENTITY_INSERT MyTable OFF

BOLからどのように機能するかについての説明を以下に示します。 http://msdn.Microsoft.com/en-us/library/aa259221(SQL.80).aspx

1
DataWriter

@Phil:テーブルに2つの列(自動インクリメントPK列とAdminName列)があるわけではありませんか? AdminNameが配置される列が1つだけの場合、AdminNameはPKであり、もちろん文字列を自動インクリメントすることはできません。ビジネスルールでは、完全修飾されたWindowsユーザー名を主キーにすることを期待していますか? AdminName列に別の一意のインデックスが必要ないため、これは実行可能であり、意味があります。

しかし、テーブルに1つではなく2つの列がある場合:

SQLServerでは、自動インクリメントはテーブル/列の定義の一部です。列を整数として定義し、増分を指定してID列にします。通常は1ですが、2または5または10などでもかまいません。行を挿入するには、他の列の値を挿入するだけで、PK列には何もしません。

insert into T
(foo)   -- column(s) list
values('bar') -- values list

挿入を行うストアドプロシージャは、SCOPE_IDENTITYをRETURN値にするか、SCOPE_IDENTITYをOUTパラメーターとしてクライアントに返すことができます。

追伸SCOPE_IDENTITY()は、現在のスコープで最後に生成された自動インクリメントID値を返します。次のID値は生成されません。

編集:

おそらく、Administratorsテーブルには管理者のセットが含まれています。しかし、整数主キー列以外に列がまったくない場合、管理者を識別する方法はありません。できることは、それらを互いに区別することだけです。それはあなたをあまり遠くまで連れて行かない。ただし、管理者テーブルに次の構造のいずれかがある場合:

ID   INTEGER PRIMARY KEY AUTOINCREMENT
windowsusername   varchar(50)  (unique index)

OR

windowsusername varchar(50) primary key

管理者のテーブルを他のテーブルから参照でき、外部キーはMEANINGFULになります。そして、それはまさに、単一の整数列で構成される表に欠けているもの、つまり意味です。

2つの列がある場合、ストアドプロシージャでこれを行うことができます。

insert into Administrators
(windowsusername)
values('mydomain\someusername');
return SCOPE_IDENTITY();

クライアントプログラムは、自動生成されて新しく挿入された行に割り当てられた自動インクリメントされたIDを戻り値として返します。このアプローチは通常の慣行であり、「ベストプラクティス」と見なされると言うまでに行きます。

追伸「挿入するものがなかった」場合、「値を挿入する」方法がわからなかったと言います。そこには矛盾があります。挿入するものがない場合、挿入する理由顧客についてまったく何も知らないのに、なぜ新しい顧客レコードを作成するのでしょうか?彼らの名前、都市、電話番号ではありませんか?

0
Tim