MySQL yabancı anahtar için RESTRICT nasıl kullanılır?


11

Veritabanı yapısında

  CREATE TABLE Country (
  name varchar(40) NOT NULL,
  PRIMARY KEY  (name)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

CREATE TABLE City (
  name varchar(40) NOT NULL,
  PRIMARY KEY  (name)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

CREATE TABLE Map (
  country varchar(40) NOT NULL,
  city varchar(100) NOT NULL,
  PRIMARY KEY  (country,city),
  FOREIGN KEY (country) REFERENCES Country (name) ON DELETE CASCADE,
  FOREIGN KEY (city) REFERENCES City (name) ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CityBu üç eşit komutla alt öğede karşılık gelen değeri olduğu gibi bırakarak ebeveyn silmek için bekliyoruz

  FOREIGN KEY (city) REFERENCES City (name) ON DELETE NO ACTION
  FOREIGN KEY (city) REFERENCES City (name) ON DELETE RESTRICT
  FOREIGN KEY (city) REFERENCES City (name)

Ancak NO ACTIONVEYA kullanırken RESTRICTveya atlarken ON DELETE. MySQL bu hatayla üst sütundan silmeme izin vermiyor:

ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails 
('test'.'Map', CONSTRAINT 'Map_ibfk_2' FOREIGN KEY ('city') REFERENCES 'City'('name')
 ON DELETE RESTRICT

Nerede yanılıyorum? NO ACTIONEbeveynleri silmek ve çocuk yetimini bırakmak SQL'lerin sorumluluğunda değil mi?

Yanıtlar:


13

SINIRI SİLME ile ilgili MySQL Belgelerine göre

• RESTRICT: Üst tablo için silme veya güncelleme işlemini reddeder. RESTRICT (veya EYLEM YOK) belirtmek, ON DELETE veya ON UPDATE yantümcesini atlamakla aynıdır.

EYLEM YOK

• EYLEM YOK: Standart SQL'den bir anahtar kelime. MySQL'de RESTRICT ile eşdeğerdir. Başvuru yapılan tabloda ilgili bir yabancı anahtar değeri varsa, InnoDB üst tablo için silme veya güncelleme işlemini reddeder. Bazı veritabanı sistemlerinin ertelenmiş çekleri vardır ve NO ACTION ertelenmiş bir çektir. MySQL'de, yabancı anahtar kısıtlamaları derhal kontrol edilir, bu nedenle HİÇBİR EYLEM RESTRICT ile aynı değildir.

SINIRI SİL, ebeveynleri çocuklardan değil silmekten korur.


5

Ebeveynini silmek ve çocuğu terk etmek istiyorsanız, muhtemelen ON DELETE SET NULLseçeneği istersiniz :

SET NULL: Üst tablodan satırı silin veya güncelleyin ve alt tablodaki yabancı anahtar sütununu veya sütunlarını NULL olarak ayarlayın. Hem ON DELETE SET NULL hem de ON UPDATE SET NULL yan tümceleri desteklenir.

SET NULL eylemini belirtirseniz, alt tablodaki sütunları NULL DEĞİL olarak bildirmediğinizden emin olun.

Son cümlede çok fazla 'yok' var, bu yüzden parent_id değerinin NULL olabileceğinden emin olun .

Ayrıca bu ilgili soruya bakın: Yabancı Anahtarları Sil / Güncelleştir'de SET NULL'un amacı nedir?

Yabancı bir anahtar tanımlayarak, veritabanına üst tabloda karşılık gelen değeri olmayan alt tablodaki girişleri kabul etmemesini söylediniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.