0

SQL標準がこれを受け入れるのはなぜですか?メリットはどれですか?

それらのテーブルがある場合:

create table prova_a (a number, b number);
alter table prova_a add primary key (a,b);
create table prova_b (a number, b number);
alter table prova_b add foreign key (a,b) references prova_a(a,b) ;
insert into prova_a  values (1,2);

これはエラーなしで挿入できます。

insert into prova_b  values (123,null);
insert into prova_b  values (null,123);

注1:これはこの回答から来ています。

注2:これは回避できます。両方の列にnullを設定しないでください。

備考:回避については質問していません。どちらがメリットになるのか興味があります。

参照:

  • Oracleのドキュメントリレーショナルモデルでは、外部キーの値を、参照されているプラ​​イマリキーまたは一意キーの値と一致させるか、nullにすることができます。複合外部キーのいずれかの列がnullの場合、キーのnull以外の部分は、親キーの対応する部分と一致する必要はありません。

  • SQL ServerのドキュメントFOREIGNKEY制約にはnull値を含めることができます。ただし、複合FOREIGN KEY制約のいずれかの列にNULL値が含まれている場合、FOREIGNKEY制約を構成するすべての値の検証はスキップされます。

4

5 に答える 5

4

一部のDBMSは、外部キー制約のある外部キーに関しては、参照整合性を強制しないことを知っています。SQLiteが思い浮かびます。ここで話されています。

他のDBMSは異なります。そのようなことを試みると、MSSQLServerが文句を言うことを私は知っています。

SQLiteには用途がありますが、同時実行性の高い状況で使用するためのものではありません。別のDBMSでこの動作が見られる場合は、ドキュメントをチェックして、同様の動作があったかどうかを確認してください。ただし、ほとんどの場合、整合性を強制する必要があります。

于 2009-02-06T07:42:42.450 に答える
2

少なくとも、SQLite (優れたデータベースであり、iPod touch で実行されます!) などを使用して運用システムを実行している場合でも、DEV は合理的に標準的な RDBMS を使用して作業を行ってください。 . 無料でダウンロードできる SQL Server Express でコードを実行すると、次のような多くのエラーが発生します。

Msg 8111, Level 16, State 1, Line 2
Cannot define PRIMARY KEY constraint on nullable column in table 'prova_a'.
Msg 1750, Level 16, State 0, Line 2
Could not create constraint. See previous errors.
于 2009-02-06T08:39:39.340 に答える
1

OracleとSQLServerはどちらもNULLの外部キーを許可しており、これが必要な理由は簡単に理解できます。たとえば、すべての行に同じテーブルの主キーを参照する親キーがあるツリーについて考えてみます。ツリーには親を持たないルートノードが必要であり、親キーはnullになります。より具体的な例:従業員とマネージャーについて考えてみてください。社内の何人かの人々、そしてそれがCEOだけであるならば、マネージャーを持たないでしょう。従業員テーブルのマネージャーIDをNULLに設定できない場合は、「マネージャーなし」の従業員を作成する必要があります。これは、実際の対応がないため、間違っています。

これがわかったので、複合キーがそのように動作する理由は明らかです。論理的には、コンポジットの一部がNULLの場合、キー全体がNULLになります。いずれかの部分がNULLの場合、文字列連結はNULLを返します。一致することはできず、これらの場合、制約は適用されません。

于 2009-02-26T03:00:10.823 に答える
0

SQL標準はこれを受け入れません。参照整合性を強制しないDBMSを見つけました。あなたが賢いなら、それをアンインストールしてください。最低限、本番目的で使用しないでください。

以前のSQL標準(SQL86)には参照整合性がなく、SQL89レベル2で修正されました。

于 2009-02-06T07:49:05.323 に答える
0

この宣言を追加してみてください:

alter table prova_b add primary key (a,b);

これにより、prova_b での NULLS が禁止されます。また、重複エントリーを禁止します。Oracle および SQL サーバーでは、インデックスも作成されます。このインデックスは、検索と結合を高速化しますが、挿入が少し遅くなります。

これはあなたがやりたいことですか?

標準 SQL を使用すると、馬鹿げていると思われることを実行できるようになるのはなぜでしょうか。これは哲学的な問題です。ほとんどのツールでは、愚かな選択が可能です。すべてのばかげた選択を禁止しようとするツールは、通常、いくつかの非常に賢い選択を意図せずに禁止することになります。

于 2009-02-06T10:44:54.563 に答える