対応OS: Windows, macOS, Linux

Navicat対応製品: Navicat for MySQL, Navicat for PostgreSQL, Navicat for Oracle, Navicat for SQL Server, Navicat for SQLite, Navicat for MariaDB, Navicat Premium

Navicat対応バージョン: すべて

 

Navicatがこの警告を出す理由は、プライマリーキーを持たないテーブルを更新する時に予期しない結果と取得する可能性があるためです。以下のサンプルを見てみましょう。

以下のテーブルを例にあげます:

Name

Surname

Age

Pete

McKensey

24

John

Slaid

34

Pete

McKensey

44

Mary

Joplen

26

このテーブルはプライマリーキーを持ちません。Peteのageを44に更新する場合、以下のステートメントがサーバーに送られます:

UPDATE "table" SET age=44 WHERE name='Pete' and surname='McKensey' and age=24;

これは正しく実行され、最初のレコードのageの値を変更します。ここで、テーブルにはPete McKensey age 44のレコードが2つできます。今、3番目のレコードのageを55に更新しようとすると、以下のステートメントがサーバーに送られます:

UPDATE "table" SET age=55 WHERE name='Pete' and surname='McKensey' and age=44;

このステートメントは、1番目と3番目のレコードのageの値を55に変更します。

このテーブルのデータは、現在、1番目と3番目のレコードが全く同じ値を持つという一貫性のない状態であり、この2つを区別する方法は全くないことに気が付くはずです。このようなことが発生するのは、テーブルが第一正規形ではない、つまり、テーブルのレコードを一意に識別するために使用できるフィールドやフィールドグループがテーブルに存在しないためです。

これが、Navicatの古いバージョンがテーブル更新に対してプライマリーキーを必要としていた理由です。このテーブルがプライマリーキーに設定されたIDフィールドを持つ場合、ステートメントは以下のようになります:

UPDATE "table" SET age=44 WHERE ID=1;
UPDATE "table" SET age=55 WHERE ID=3;

これらのステートメントは、データの矛盾を引き起こしません。

本件について多くのお問い合わせをいただきましたので、現在、Navicatは警告を表示するだけで、プライマリーキーを持たないテーブルでも更新できるように変更されています。

さらに質問がございましたら、
チケット送信