1

null フィールドが含まれている場合、makumba が複数のフィールド間の一意性検証ルールをどのように処理しているのか疑問に思っています。

例: a = null ではない 空でない char... b = ptr ... unique(a, b)

「b」が null の場合はどうなりますか。このチェックは「+null」で行われますか、それともバイパスされますか?

4

1 に答える 1

1

2つの異なるケースがあります

(1)検証ルールが1つのMDDのフィールドのみを対象としている場合、これはデータベースレベルでの一意の制約に変換され、使用されるDBエンジンによってはその処理方法が異なる場合があります。

mysqlでは、null値を繰り返すことができます(http://dev.mysql.com/doc/refman/5.1/en/create-table.html)

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

つまり、実際には同じレコードを持つことができます!

次のことを確認できます。

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     |
+-------+-------+-------+

したがって、該当する場合は、問題のフィールドにnull以外のステートメントを追加することをお勧めします。

(2)ルールが他のMDDからのフィールドもカバーしている場合(たとえば、ptrフィールドを介して)、これはクエリを介してチェックされます-クエリに一致するレコードがすでに存在する場合、一意性チェックは文句を言います。この場合、nullは他の値と同じように扱う必要があります。つまり、2つの同一のレコードを持つ2つのレコードを持つことはできません。

于 2012-03-16T18:13:20.263 に答える