これらの2つのSQLクエリの違いは何ですか?

このSQLクエリでテーブルAddressを作成しました:

CREATE TABLE `address` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `Street` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `Number` smallint(6) DEFAULT NULL,
  `other_id` bigint(20) NOT NULL,
  PRIMARY KEY (`id`),
  FOREIGN KEY (`other_id`) REFERENCES `other` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

しかし、このクエリもあります:

CREATE TABLE `address` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `Street` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `Number` smallint(6) DEFAULT NULL,
  `other_id` bigint(20) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `other_id` (`other_id`),
  CONSTRAINT `adress_ibfk_1` FOREIGN KEY (`other_id`) REFERENCES `other` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci$$

ブースのクエリで同じテーブルが作成されているようです。

だから誰も私にこの行が何を説明することができます:

KEY `other_id` (`other_id`),

これら2つの行の違いは何ですか?

  FOREIGN KEY (`other_id`) REFERENCES `other` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
and
  CONSTRAINT `adress_ibfk_1` FOREIGN KEY (`other_id`) REFERENCES `other` (`id`) ON DELETE CASCADE ON UPDATE CASCADE

最後の2行の違いが後者の場合、外部キーに 'adress_ibfk_1'という名前を付けますか?それが本当なら - 私はそれをするべきですか?私は外来キーに名前を付けるべきですか?私は彼らの名前が必要でしょうか?

ありがとう! :)

0
あなたにすべてのOMG:これはちょうど私の質問を説明するための愚かなテーブルです...そして、ええ、私はアドレスのスペルを間違えた...
追加された 著者 xx77aBs,
@ f00:なぜ、すべてのテーブルでbigintを使うのが小さなプロジェクトで問題になるのか分かりません。とにかく、他のどのデータ型を調整すべきだと思いますか?どのデータ型を使用しますか?
追加された 著者 xx77aBs,
@HLGEM:ああ、私はそれが女性の服装の単一のアイテムが保管されていた場所だと仮定しました。
追加された 著者 Larry Lustig,
@HLGEM - テーブル名がスウェーデン語でない限り:)。しかし、フィールド名はスウェーデン語ではないので、おそらく正しいでしょう。
追加された 著者 Mikael Eriksson,
プロジェクトのすべての開発者は、アドレスのスペルを正しくするためにテーブルの名前を修正しないと、永遠にあなたを嫌うでしょう。
追加された 著者 HLGEM,
その大量の未割り当てのBIGINTにいくつのアドレスを格納すると思いますか?他のデータ型にもアドレス指定が必要です。
追加された 著者 Jon Black,
追加された 著者 santiagobasulto,

2 答え

KEY is a synonym for INDEX, so that is creating an index on the other_id column.

外部キー構造の唯一の違いは、後者の constraint バージョンでは制約に名前を付けることができ、前者にはシステム生成名が与えられることです。

この名前は、 INFORMATION_SCHEMA TABLE_CONSTRAINTS で確認できます。表。

2
追加された

MySQLは KEY をインデックスとして解釈し、2番目のクエリは other_id の列にインデックスを作成します。

2つのFK宣言の違いは、2行目に手動で名前を設定することです。最初の行で、MySQLは自動的に名前を設定します。
彼らは名前が必要ですが、必ずしもそれらを認識する必要はありません。いくつかの高度なRDBMSでは、クエリでエラーが発生した場合に、より明示的に使用されます。

2
追加された
ありがとうございました !!しかし、最初の照会では、列other_idに索引も作成されます。だから私はそれを指定しなくても作成されます、ちょうどFKがその名前になるのと同じですか?
追加された 著者 xx77aBs,
だからルールではない?つまり、FK列の索引を自動的に作成しないRDBMSが存在する可能性があります。
追加された 著者 xx77aBs,
xx77aBs:わかりませんが、MySQLはFK列に自動的にインデックスを作成します。
追加された 著者 Vincent Savard,