Bu iki SQL sorgusu arasındaki fark nedir?

Bu SQL sorgusuyla tablo adresi oluşturdum:

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;

Ancak bu sorgu da var:

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

ve kabin sorgusu aynı tabloları oluşturuyor gibi görünüyor.

Yani herkes bana şu hatların ne yaptığını açıklayabilir:

KEY `other_id` (`other_id`),

ve bu iki satır arasındaki fark nedir:

  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

Son iki satır arasındaki fark, ikincisinin 'adress_ibfk_1' adını yabancı anahtar olarak verir mi? Eğer bu doğruysa - yapmalı mıyım? Demek istediğim, neden yabancı anahtarları seçmeliyim? Adlarına hiç ihtiyacım olacak mı?

Teşekkürler ! :)

0
Hepinize OMG: D sorumu açıklayan aptalca bir masa ... ve evet, adresi yanlış yazdım.
katma yazar xx77aBs, kaynak
@ f00: peki neden tüm tablolarda bigint kullanmanın küçük bir projede sorun olduğunu görmüyorum? Neyse, başka hangi veri tiplerini ayarladığımı düşünüyorsun? Hangi veri türlerini kullanırdınız?
katma yazar xx77aBs, kaynak
@HLGEM: Oh, kadınların parti kıyafetlerinin tek bir parçasının depolandığı yer olduğunu varsaydım.
katma yazar Larry Lustig, kaynak
@HLGEM - Tablo isimleri İsveççe değilse :) :). Fakat alan adları İsveççe olmadığı için muhtemelen doğrudur.
katma yazar Mikael Eriksson, kaynak
Projenizdeki tüm geliştiriciler, adresin doğru bir şekilde yazılması için tablonun adını düzeltmezseniz sizi sonsuza dek nefret edecektir.
katma yazar HLGEM, kaynak
Bu MASSIVE UNSIGNED BIGINT'te kaç tane adres saklayacağını düşünüyorsun? Diğer veri türleriniz de adreslemeye ihtiyaç duyar!
katma yazar Jon Black, kaynak

2 cevap

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

Yabancı anahtar yapısındaki tek fark, ikinci kısıtlama versiyonunun kısıtı adlandırmanıza izin vermesidir, oysa eskiden sistem tarafından üretilen bir isim verilecektir.

Bu ad INFORMATION_SCHEMA TABLE_CONSTRAINTS sayfasında görülebilir. tablo.

2
katma

MySQL, KEY değerini bir indeks olarak yorumlar, böylece ikinci sorgu other_id sütununda bir dizin oluşturur.

İki FK bildirimi arasındaki fark, adı ikinci satırda elle ayarlamanızdır. İlk satırda, MySQL otomatik olarak bir isim ayarlar.
İsimlere ihtiyaçları var ama onların farkında olmak zorunda değilsiniz. Bazı daha gelişmiş RDBMS, bir sorgu bir hata oluşturduğunda bunları daha açık olmak için kullanır.

2
katma
Teşekkür ederim !! Ancak ilk sorgu ayrıca diğer_id sütununda dizin oluşturur. Bunu belirtmeme rağmen, FK'nin adı gibi bir şey yaratıyor mu?
katma yazar xx77aBs, kaynak
Yani kural değil mi? Yani, FK sütunlarında otomatik olarak dizin oluşturmayacak RDBMS olabilir mi?
katma yazar xx77aBs, kaynak
xx77aBs: Emin değilim, ancak MySQL büyük olasılıkla FK sütunlarında otomatik olarak bir dizin oluşturur.
katma yazar Vincent Savard, kaynak