example - Significato esatto della chiave esterna di MySQL "on delete restrict"



mysql drop constraint (2)

Ho due tabelle MySQL: collections e privacy_level .
Li definisco con una relazione di chiave straniera in quanto tale:

CREATE TABLE collections (
  coll_id smallint NOT NULL AUTO_INCREMENT UNSIGNED,
  name varchar(30) NOT NULL,
  privacy tinyint NOT NULL UNSIGNED DEFAULT '0',
  PRIMARY KEY(coll_id),
  INDEX(privacy),
  FOREIGN KEY fk_priv (privacy) REFERENCES privacy_level (level) ON UPDATE CASCADE ON DELETE RESTRICT
) ENGINE=InnoDB;  

 CREATE TABLE privacy_level (
   level tinyint NOT NULL UNSIGNED,
   name varchar(20) NOT NULL,
   PRIMARY KEY (level)
 ) ENGINE InnoDB;  

La mia domanda riguarda la clausola ON DELETE RESTRICT e non sono riuscito a ricavare la risposta dal manuale online o da una ricerca su google.

Questo significa che non posso mai cancellare una riga da privacy_level ?
Oppure, significa che non posso cancellare una riga da privacy_level se una riga da collections.privacy ha un valore uguale a un valore in privacy_level.level ?

Cioè, se privacy_level ha level = 2 , name = 'top secret' ma nessuna voce in collections.Privacy ha privacy = 2 , posso cancellare il level = 2 , name = 'top secret' ? O è vietato su una base ampia colonna?

Grazie per qualsiasi intuizione.


Answer #1

Inoltre puoi usare ON DELETE CASCADE , cioè quando cancelli il genitore tutti i bambini verranno rimossi automaticamente, ciò è utile quando hai una tabella associata ad un'altra che contiene alcuni parametri o impostazioni.


Answer #2

ON DELETE RESTRICT significa che non è possibile eliminare una determinata riga genitore se esiste una riga secondaria che fa riferimento al valore per quella riga padre. Se la riga padre non ha righe figlio referenziate, è possibile eliminare quella parent riga.

ON DELETE RESTRICT è praticamente una sintassi superflua , perché questo è comunque il comportamento predefinito per una chiave esterna.





foreign-keys