2012-03-16 20 views
1

nullフィールドが関連する場合、makumbaが複数のフィールド間の一意性検証ルールをどのように処理するのかと思います。例えばMDD一意性検証ルール

: = NOT NULLではない、空の文字... = PTR ... ユニークB(a、b)は

'b' がnullの場合に発生しますどのような。このチェックは '+ null'で行われるのでしょうか、それともバイパスされるのでしょうか?

答えて

1

二つの異なる例

があります

(1)検証ルールは1 MDDからのフィールドだけをカバーする場合、これはデータベースレベルでの一意制約に変換されます、そしてそれがどのように扱われるかが依存する可能性があります使用されているDBエンジン。

MySQLでは

、ヌル値が(http://dev.mysql.com/doc/refman/5.1/en/create-table.html)を繰り返すことを許可されている

UNIQUEインデックス制約を作成しますインデックス内のすべての値が異なる必要があります。既存の行と一致するキー値を持つ新しい行を追加しようとすると、エラーが発生します。すべてのエンジンについて、UNIQUE索引は、NULLを含むことができる列に対して複数のNULL値を許可します。

e.e.e.あなたは実際には同じレコードを持つことができます!

あなたはそれを確認することができます。

mysql> CREATE TABLE example (data1 VARCHAR(100), data2 varchar(100), data3 varchar(100)); 
mysql> alter table example add unique index(data1, data2, data3); 

mysql> insert into example values ("a", "a", "a"); 
Query OK, 1 row affected (0.00 sec) 
mysql> insert into example values ("a", "a", "a"); 
ERROR 1062 (23000): Duplicate entry 'a-a-a' for key 'data1' 
mysql> insert into example values ("a", "a", null); 
Query OK, 1 row affected (0.00 sec) 
mysql> insert into example values ("a", "a", null); 
Query OK, 1 row affected (0.00 sec) 
mysql> insert into example values ("a", "a", null); 
Query OK, 1 row affected (0.00 sec) 
mysql> insert into example values ("a", "a", null); 
Query OK, 1 row affected (0.00 sec) 

mysql> select * from example; 
+-------+-------+-------+ 
| data1 | data2 | data3 | 
+-------+-------+-------+ 
| a  | a  | NULL | 
| a  | a  | NULL | 
| a  | a  | NULL | 
| a  | a  | NULL | 
| a  | a  | a  | 
+-------+-------+-------+ 

該当するのであれば、あなたは、問題のフィールドにヌルでないステートメントを追加することもできます。

(2)ルールが他のMDDのフィールド(ptrフィールドなど)をもカバーしている場合、クエリを介してチェックされます。クエリに一致するレコードがすでに存在する場合は、一意性チェックがエラーになります。 この場合、nullは他の値と同じように扱われます。つまり、2つの同一のレコードを持つ2つのレコードを持つことができないようにすべきです。

+0

私が知る必要があったのとまったく同じです。ありがとう! –

関連する問題