2011-11-09 9 views
43

Ho due tabelle MySQL: collections e privacy_level.
li definiscono con una chiave esterna rapporto come tale:Esatto Significato della chiave esterna di MySQL 'on delete restrict' Clausola

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 ho potuto derivare la risposta dal manuale in linea o una ricerca su Google.

Ciò significa che è possibile mai eliminare una riga da privacy_level?
O, vuol dire che io non riesco a eliminare una riga da privacy_levelse una riga da collections.privacy ha un valore che è lo stesso di 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, name = 'top secret' ingresso level = 2? O è vietato su una base ampia colonna?

Grazie per qualsiasi intuizione.

risposta

85

ON DELETE RESTRICT significa che non si può eliminare un dato riga padre se una riga bambino esiste che fa riferimento il valore per quella riga padre. Se la riga padre non ha righe figlio referenziate, è possibile eliminare quella parent riga.

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

+0

Significa che "ON DELETE RESTRICT' è lo stesso di" ON DELETE NO ACTION "? – Shafizadeh

+0

@Shafizadeh, leggi http://www.vertabelo.com/blog/technical-articles/on-delete-restrict-vs-on-delete-no-action –

+0

@Bill, l'articolo dice NO ACTION è lo stesso di RESTRICT in MySQL e fa riferimento [indietro a SO] (https://stackoverflow.com/questions/5809954/mysql-restrict-and-no-action) per confermare la loro dichiarazione ... – Code4R7

0

Inoltre, è possibile utilizzare ON DELETE CASCADE, ciò significa che quando si elimina il genitore tutti i bambini verranno rimossi automaticamente, ciò è utile quando si ha una tabella associata ad un'altra che contiene alcuni parametri o impostazioni.

Problemi correlati