27 Gennaio 2022
Expand search form

Possiamo inserire null nella colonna foreign key di SQL Server?

Questo forum è migrato a Microsoft Q&A. Visita Microsoft Q&A per postare nuove domande.

Risposto da:

Domanda

Sto cercando di inserire un record in una tabella che ha un vincolo di chiave esterna per un’altra tabella utilizzando una relazione molti a uno. Il problema è che ho bisogno di rendere il valore della chiave esterna NULL, ma sto ottenendo un errore quando lo faccio.

L’istruzione INSERT è andata in conflitto con il vincolo FOREIGN KEY ‘FK_emp_depts’. Database employees, tabella dbo.employee, colonna dept_id

Se spengo il ‘Enforce Foreign Key Constraint’ allora posso inserire il record (questo è lo stesso che aggiungere NOCHECK). Inoltre, la colonna è definita come CHAR(6) NULL, quindi questo è un valore accettabile.

tabella primaria impiegati, tabella secondaria dipartimenti. In questo caso sto aggiungendo un nuovo dipendente ma non è ancora stato assegnato a un dipartimento, quindi il campo FK dept_id è nullo.

Il vincolo è aggiunto come ‘alter table dbo.employee add constraint fk_emp_depts foreign key ([dept_id]) references [departments] ([department_id])

Ero convinto che inserire un NULL in un campo FK fosse OK in quanto il vincolo veniva controllato solo se veniva fornito un valore, o c’è qualcosa che ho dimenticato di aggiungere alla tabella. Il department_id è un PK con un indice clustered.

Risposte

Hai ragione, puoi inserire NULL in una colonna chiave esterna senza ottenere un errore. Per esempio, il seguente inserisce due righe con NULL nella colonna chiave esterna senza errori, poi tenta di inserire una riga con un valore non valido nella chiave esterna e ottiene l’errore di chiave esterna.

Quindi state facendo qualcosa che sta mettendo un valore diverso da NULL in quella colonna. Forse avete un vincolo predefinito, forse avete un trigger che mette un valore in quella colonna. Forse qualcos’altro. È difficile per noi indovinare. Se puoi mettere insieme un esempio come quello sopra (tranne, ovviamente, ottiene l’errore quando inserisci NULL) che possiamo copiare e incollare ed eseguire per duplicare il tuo problema, sono sicuro che possiamo dirti la causa del tuo errore.

  • Proposto come risposta da Xi Jin giovedì 13 luglio 2017 6:23
  • Segnato come risposta da AndyW2007 giovedì 13 luglio 2017 9:00 PM

Tutte le risposte

Hai ragione, puoi inserire NULL in una colonna chiave esterna senza ottenere un errore. Per esempio, il seguente inserisce due righe con NULL nella colonna chiave esterna senza errori, poi tenta di inserire una riga con un valore non valido nella chiave esterna e ottiene l’errore di chiave esterna.

Quindi state facendo qualcosa che sta mettendo un valore diverso da NULL in quella colonna. Forse avete un vincolo predefinito, forse avete un trigger che mette un valore in quella colonna. Forse qualcos’altro. È difficile per noi indovinare. Se puoi mettere insieme un esempio come quello sopra (tranne, ovviamente, ottiene l’errore quando inserisci NULL) che possiamo copiare e incollare ed eseguire per duplicare il tuo problema, sono sicuro che possiamo dirti la causa del tuo errore.

  • Proposto come risposta da Xi Jin giovedì 13 luglio 2017 6:23
  • Segnato come risposta da AndyW2007 giovedì 13 luglio 2017 9:00 PM

Ciao grazie per la tua risposta.

Ho tagliato e incollato il tuo esempio in una finestra di query.

L’istruzione INSERT era in conflitto con il vincolo FOREIGN KEY “fk_Foo_emp_depts”. Il conflitto si è verificato nel database “tempdb”, tabella “dbo.Foo_departments”, colonna ‘department_id’.

Mi aspetto che questo sia valido dalla linea insert (3,1) poiché 1 non esiste in dept.

Sto usando SQL Server 2016

Se aggiungo la seguente linea dopo la prima dichiarazione di alter table

alter table dbo.foo_employee NOCHECK constraint fk_foo_emp_dpts

allora la query funziona. Tuttavia non sono sicuro se NOCHECK sta disattivando il vincolo per tutto il tempo, o solo per gli inserimenti. L’idea di un vincolo per me è di prevenire l’inserimento di dati errati, quindi disattivarlo sembra un po’ strano.

Ottengo la violazione FK con il codice di Tom. Non riesco a pensare ad una ragione per cui non stai ottenendo l’errore previsto.

NOCHECK disabilita effettivamente il vincolo, che è il motivo per cui non ottieni l’errore dopo. Non è qualcosa che faresti per gli inserimenti di routine.

Dan Guzman, MVP della piattaforma dati, http://www.dbdelta.com

>> tabella primaria [sic] dipendente [sic],
tabella secondaria [sic] dipartimenti. <<

Dove hai preso i termini primario e secondario? In SQL. Abbiamo tabelle di riferimento e tabelle di riferimento. Perché pensi di avere un solo dipendente? In RDBMS. Le tabelle rappresentano insiemi, quindi i loro nomi o plurali o sostantivi collettivi (in questo caso probabilmente: Personnel)

>> In questo caso sto aggiungendo un nuovo dipendente ma non è ancora stato assegnato a un dipartimento, quindi il campo FK[sic] dept_id è nullo. <<

Potresti voler cercare cosa significa il termine “campo” in SQL. C’è un’enorme differenza tra un campo e una colonna. Tuttavia, mi piacerebbe suggerire che se hai un dipendente assegnato, che crei un dipartimento fittizio e fai riferimento ad esso nella tua tabella di assegnazione. La tabella di assegnazione è ciò che collega i dipendenti ai dipartimenti. Un dipartimento non è un attributo di un dipendente! L’assegnazione del lavoro è una relazione, quindi ha la sua propria tabella.

Se fai una corretta progettazione dello schema, troverai che tutti hanno pochissimo bisogno di nulls e di chiavi esterne, ecc.

–CELKO– Libri nella serie Celko per Morgan-Kaufmann Publishing: Analytics e OLAP in SQL / Dati e database: Concepts in Practice Data / Misure e standard in SQL SQL for Smarties / SQL Programming Style / SQL Puzzles and Answers / Thinking in Sets / Trees and Hierarchies in SQL

Potresti anche essere interessato agli argomenti

Sono ammessi valori nulli nella chiave esterna?

Vincolo NOT NULL sulla chiave esterna Quando i valori nulli non sono ammessi in una chiave esterna, ogni riga della tabella figlia deve fare esplicitamente riferimento a un valore nella chiave madre perché i valori nulli non sono ammessi nella chiave esterna.

Continua…

Come faccio a permettere i null nella chiave esterna?

Poiché il vincolo della chiave esterna richiede che la chiave referenziata sia unica, il meglio che puoi fare è permettere una riga con una chiave che sia NULL. In questo caso, dovrete sostituire il vincolo di Chiave Primaria con un vincolo Unico (o indice), e permettere che la colonna Countries. country_id sia NULL.Jan 25, 2012

Continua…

Come si inserisce un null in una colonna?

È possibile inserire un valore NULL in una colonna int con una condizione, cioè la colonna non deve avere vincoli NOT NULL. La sintassi è la seguente. INSERT INTO yourTableName(yourColumnName) values(NULL);Jan 11, 2019

Continua…

Le chiavi esterne possono essere nulle mySQL?

5 Risposte. I NULL nelle chiavi esterne sono perfettamente accettabili. Trattare con i NULL nelle chiavi esterne è difficile, ma ciò non significa che si cambiano tali colonne in NOT NULL e si inseriscono record fittizi (“N/A”, “Unknown”, “No Value” ecc.) nelle tabelle di riferimento.May 10, 2010

Continua…

Come si inserisce una colonna NULL in SQL?

Potete anche specificare la parola chiave NULL nella clausola VALUES per indicare che ad una colonna deve essere assegnato un valore NULL. L’esempio seguente inserisce valori in tre colonne della tabella ordini: INSERT INTO orders (orders_num, order_date, customer_num) VALUES (0, NULL, 123);

Continua…

È possibile inserire NULL in SQL?

L’istruzione SQL INSERT può anche essere usata per inserire un valore NULL per una colonna.26 febbraio 2020

Continua…

Perché la chiave esterna permette valori nulli?

Alla chiave esterna può essere assegnato un nome di vincolo. … Una chiave esterna contenente valori nulli non può corrispondere ai valori di una chiave madre, poiché una chiave madre per definizione non può avere valori nulli. Tuttavia, un valore nullo di una chiave esterna è sempre valido, indipendentemente dal valore di una qualsiasi delle sue parti non nulle.

Continua…

Perché la mia chiave esterna è nulla?

R: Se una colonna può contenere o meno un valore NULL è determinato dalla presenza o assenza di un vincolo NOT NULL. Questo è completamente indipendente dal fatto che la colonna sia referenziata in un vincolo di chiave esterna. Il valore nella colonna è NULL perché questo è il valore che è stato assegnato quando la riga è stata inserita.Jan 15, 2015

Continua…

La chiave unica consentirà i valori nulli?

La chiave primaria non accetta valori NULL mentre la chiave unica può accettare valori NULL. Una tabella può avere solo una chiave primaria mentre ci possono essere più chiavi uniche su una tabella. Un indice clusterizzato viene creato automaticamente quando viene definita una chiave primaria, mentre la chiave unica genera l’indice non clusterizzato.Oct 18, 2021

Continua…

Come posso creare un OrderedDict vuoto in Python?

“generare un ordereddict vuoto in python” Codice Rispostada collezioni importazione OrderedDict.d = OrderedDict()d[‘a’] = 1.d[‘b’] = 2.d[‘c’] = 3.for key, value in d. items():More items…-31 maggio 2020

Continua…

OrderedDict è ancora necessario?

No, non diventerà ridondante in Python 3.7 perché OrderedDict non è solo un dict che mantiene l’ordine di inserimento, offre anche un metodo dipendente dall’ordine, OrderedDict.Jun 15, 2018

Continua…

Come faccio a inserire una colonna vuota nella query SQL?

Semplicemente 0 come segnaposto come suggerito da Galz è la strada da percorrere.Mar 4, 2011

Continua…

I dittici sono ordinati Python?

I dizionari sono ordinati in Python 3.6 (almeno sotto l’implementazione CPython) a differenza delle incarnazioni precedenti.Oct 11, 2016

Continua…

Come faccio a creare un OrderedDict?

Possiamo creare un dizionario ordinato usando la funzione OrderedDict nelle collezioni. Il dizionario ordinato conserva l’ordine di inserimento. Possiamo iterare attraverso gli elementi del dizionario e vedere che l’ordine è conservato.Sep 12, 2019

Continua…

I dizionari sono ordinati?

I dizionari sono ordinati in Python 3.6 (almeno sotto l’implementazione CPython) a differenza delle incarnazioni precedenti.Oct 11, 2016

Continua…

Articolo precedente

Posso rinnovare la mia CDL della Florida online?

Articolo successivo

Come mi preparo per il test d’inglese del college?

You might be interested in …

Che cos’è la giustificazione LDS?

Sebbene la parola “giustificare” abbia diversi significati, il suo significato principale nelle Scritture degli ultimi giorni è inseparabilmente intrecciato con i concetti di grazia (Rom. 3:28; Gal. 2:16; 2 Ne. 2:5; Mosia 14:11; DeA 20:30; […]

Chi ha fatto la festa della salsiccia?

Quando si tratta di un film d’animazione osceno e vietato ai minori, non bisogna escluderlo dalla stagione degli Oscar. Come promemoria: 1999’s South Park: Bigger, Longer & Uncut fu nominato nella categoria miglior canzone per […]