Quali sono i vincoli del database? [chiuso]


92

Qual è una chiara definizione di vincolo del database? Perché i vincoli sono importanti per un database? Quali sono i tipi di vincoli?


12
Questa domanda ha una risposta chiara. Non è "troppo ampio". Il suo gran numero di voti positivi e preferiti rivela quanto sia stato utile per molte persone. Ho ripulito il testo e l'ho proposto per la riapertura.
La-comadreja

@BasilBourque questa domanda è molto scarsa per i programmatori - verrebbe rapidamente respinta e chiusa lì, vedi meta.programmers.stackexchange.com/questions/6483/… Letture consigliate: Cosa succede a Programmers.SE? Una guida per Stack Overflow
gnat

1
@gnat Mentre quella pagina mi lascia ancora confuso su ciò che è o non è in argomento per Programmers Stack Exchange, posso capire e concordare con una soglia minima dell'autore del post che ha prima letto un articolo di Wikipedia direttamente rilevante che fornisce il lo stesso tipo di panoramica sintetica o riepilogativa richiesta su Stack Exchange.
Basil Bourque

2
Il titolo è troppo ampio e le domande secondarie fanno più domande contemporaneamente -_- Come vogliono TomTom, P ரதீப், greg-449, bummi e Nit? Spiega per favore. C'è comunque che puoi chiedere dei vincoli ...?
Lealo

Sebbene comprenda i sentimenti verso le domande che sono troppo board e basate sull'opinione, non sono d'accordo con il requisito della prima lettura dell'articolo di wikipedia. NON fornisce lo "stesso tipo di panoramica sintetica o sommaria". La risposta accettata fornisce una risposta molto più sintetica e puntuale rispetto al collegamento di wikipedia sopra.
Chris

Risposte:


117

I vincoli fanno parte di una definizione dello schema del database.

Un vincolo è solitamente associato a una tabella e viene creato con un'istruzione CREATE CONSTRAINTo CREATE ASSERTIONSQL.

Definiscono determinate proprietà a cui devono conformarsi i dati in un database. Possono applicarsi a una colonna, un'intera tabella, più di una tabella o un intero schema. Un sistema di database affidabile garantisce che i vincoli siano sempre presenti (tranne possibilmente all'interno di una transazione, per i cosiddetti vincoli differiti).

I tipi comuni di vincoli sono:

  • not null - ogni valore in una colonna non deve essere NULL
  • unico : i valori nelle colonne specificate devono essere univoci per ogni riga di una tabella
  • chiave primaria : i valori nelle colonne specificate devono essere univoci per ogni riga di una tabella e non essere NULL ; normalmente ogni tabella in un database dovrebbe avere una chiave primaria - viene utilizzata per identificare i singoli record
  • chiave esterna : i valori nelle colonne specificate devono fare riferimento a un record esistente in un'altra tabella (tramite la sua chiave primaria o qualche altro vincolo univoco )
  • check - viene specificata un'espressione, che deve restituire true affinché il vincolo sia soddisfatto

3
+1 per includere PK, non null, null
gbn

+1, puoi comunque espandere gli scenari di FOREIGN KEY e fornire alcuni link.
Irragionevole

2
I vincoli di controllo non devono restituire false. Non devono essere vere. Anche Unknown va bene.
Martin Smith

2
Anche un vincolo di tipo non sarebbe un tipo comune?
Martin

1
Sebbene di solito non li chiamiamo vincoli, direi che il tipo di dati è una forma di vincolo. Se definisco qualcosa come Int o datetime, ciò limita il tipo di dati che possono essere inseriti nel campo. La corretta selezione dei tipi di dati è una parte fondamentale per garantire l'integrità dei dati.
HLGEM

36

Per capire perché abbiamo bisogno di vincoli, devi prima capire il valore dell'integrità dei dati.

L'integrità dei dati si riferisce alla validità dei dati. I tuoi dati sono validi? I tuoi dati rappresentano ciò per cui li hai progettati?

Quali strane domande ti pongo potrebbero pensare, ma purtroppo troppo spesso, i database sono pieni di dati inutili, riferimenti non validi a righe in altre tabelle, che sono scomparsi da tempo ... e valori che non significano nulla per la logica aziendale della tua soluzione.

Tutta questa spazzatura non è solo incline a ridurre le tue prestazioni, ma è anche una bomba a orologeria nella logica dell'applicazione che alla fine recupererà dati che non è progettata per comprendere.

I vincoli sono regole che crei in fase di progettazione che proteggono i tuoi dati dalla corruzione. È essenziale per la sopravvivenza a lungo termine del tuo cuore figlio di una soluzione di database. Senza vincoli, la tua soluzione decadrà definitivamente con il tempo e l'uso intenso.

Devi riconoscere che la progettazione del design del tuo database è solo la nascita della tua soluzione. Qui dopo deve vivere (si spera) a lungo e sopportare tutti i tipi di (strani) comportamenti da parte dei suoi utenti finali (es. Applicazioni client). Ma questa fase di progettazione nello sviluppo è cruciale per il successo di lunga data della tua soluzione! Rispettalo e dedicagli il tempo e l'attenzione che richiede.

Un uomo saggio una volta disse: "I dati devono proteggersi!" . E questo è ciò che fanno i vincoli. Sono regole che mantengono i dati nel database il più validi possibile.

Ci sono molti modi per farlo, ma fondamentalmente si riducono a:

  • I vincoli di chiave esterna sono probabilmente il vincolo più utilizzato e garantisce che i riferimenti ad altre tabelle siano consentiti solo se esiste effettivamente una riga di destinazione a cui fare riferimento. Ciò rende anche impossibile interrompere tale relazione eliminando la riga di riferimento creando un collegamento morto.
  • I vincoli di controllo possono garantire che in determinate colonne siano consentiti solo valori specifici. È possibile creare un vincolo consentendo solo la parola "Giallo" o "Blu" in una colonna VARCHAR. Tutti gli altri valori produrrebbero un errore. Ottieni idee per l'utilizzo dei vincoli di controllo controlla la sys.check_constraintsvisualizzazione nel database di esempio AdventureWorks
  • Le regole in SQL Server sono solo riutilizzabili Controlla vincoli (consente di mantenere la sintassi da un unico posto e semplificare la distribuzione dei vincoli ad altri database)

Come ho accennato qui, sono necessarie alcune considerazioni approfondite per costruire l'approccio di vincolo migliore e più difensivo per la progettazione del tuo database. Innanzitutto è necessario conoscere le possibilità e i limiti dei diversi tipi di vincoli di cui sopra. Ulteriori letture potrebbero includere:

Vincoli CHIAVE ESTERI - Microsoft

Vincolo di chiave esterna - w3schools

CONTROLLA i vincoli

In bocca al lupo! ;)


Come commento negativo, sembra che le regole vengano ora defecate da Microsoft.
Gary

6

I vincoli non sono altro che le regole sui dati. Quali dati sono validi e cosa non è valido possono essere definiti utilizzando dei vincoli. Quindi, quell'integrità dei dati può essere mantenuta. Di seguito sono riportati i vincoli ampiamente utilizzati:

  1. Chiave primaria : che identifica in modo univoco i dati. Se questo vincolo è stato specificato per una determinata colonna, non possiamo inserire dati duplicati in quella colonna
  2. Controllare : come NOT NULL. Qui possiamo specificare quali dati possiamo inserire per quella particolare colonna e cosa non è previsto per quella colonna.
  3. Chiave esterna : riferimenti di chiave esterna alla riga di un'altra tabella. In modo che i dati riferiti in una tabella da un'altra tabella siano sempre disponibili per la tabella di riferimento.

3

I vincoli possono essere utilizzati per applicare proprietà specifiche dei dati. Un semplice esempio consiste nel limitare una colonna int ai valori [0-100000]. Questa introduzione sembra buona.


3

I vincoli determinano quali valori sono validi per i dati nel database. Ad esempio, puoi imporre che il valore a non sia nullo (un NOT NULLvincolo) o che esista come vincolo univoco in un'altra tabella (un FOREIGN KEYvincolo) o che sia unico all'interno di questa tabella (un UNIQUEvincolo o forse un PRIMARY KEYvincolo a seconda dei tuoi requisiti ). Vincoli più generali possono essere implementati utilizzando CHECKvincoli.

La documentazione MSDN per i vincoli di SQL Server 2008 è probabilmente il miglior punto di partenza.


2
  1. UNIQUEvincolo (di cui un PRIMARY KEYvincolo è una variante). Verifica che tutti i valori di un determinato campo siano univoci nella tabella. Questo è il Xvincolo -axis (record)

  2. CHECKvincolo (di cui un NOT NULLvincolo è una variante). Verifica che una determinata condizione valga per l'espressione sui campi dello stesso record. Questo è il Yvincolo -axis (campi)

  3. FOREIGN KEYvincolo. Verifica che il valore di un campo si trovi tra i valori di un campo in un'altra tabella. Questo è il Zvincolo -axis (tabelle).


Vincoli univoci e vincoli di chiave esterna possono essere scritti utilizzando i CHECKvincoli, quindi perché classificarli in modo diverso? cioè " Y-axis" (qualunque cosa significhi).
giorno del

2
@onedaywhen: come si implementa FOREIGN KEYun CHECKvincolo using ?
Quassnoi

1
@onedaywhen: prova a creare una tabella con questo vincolo.
Quassnoi

1
@onedaywhen: è così difficile provare? Suggerimento: questo non funzionerà.
Quassnoi

3
@onedaywhen: la query che hai scritto non crea un vincolo di controllo. È una semplice SELECTdomanda. Non è possibile utilizzare sottoquery (o qualsiasi altro costrutto che fa riferimento a valori esterni al record corrente) nei CHECKvincoli in SQL Server.
Quassnoi

2

Un database è la rappresentazione logica computerizzata di un modello concettuale (o aziendale), costituito da un insieme di regole aziendali informali. Queste regole rappresentano il significato dei dati compreso dall'utente. Poiché i computer comprendono solo rappresentazioni formali, le regole aziendali non possono essere rappresentate direttamente in un database. Devono essere mappati su una rappresentazione formale, un modello logico, che consiste in un insieme di vincoli di integrità. Questi vincoli - lo schema del database - sono la rappresentazione logica nel database delle regole di business e, quindi, sono il significato dei dati compreso dal DBMS. Ne consegue che se il DBMS non è a conoscenza e / o non applica l'intera serie di vincoli che rappresentano le regole aziendali, ha una comprensione incompleta del significato dei dati e, quindi,

Nota: il significato DBMS - "compreso" - vincoli di integrità - non è identico al significato compreso dall'utente - regole aziendali - ma, nonostante la perdita di qualche significato, acquisiamo la capacità di meccanizzare inferenze logiche dai dati.

"Una vecchia classe di errori" di Fabian Pascal


2

Esistono fondamentalmente 4 tipi di vincoli principali in SQL:

  • Vincolo di dominio: se uno dei valori di attributo forniti per una nuova tupla non è del dominio di attributo specificato

  • Vincolo chiave: se il valore di un attributo chiave in una nuova tupla esiste già in un'altra tupla nella relazione

  • Integrità referenziale: se un valore di chiave esterna in una nuova tupla fa riferimento a un valore di chiave primaria che non esiste nella relazione referenziata

  • Entity Integrity: se il valore della chiave primaria è nullo in una nuova tupla


-1

i vincoli sono condizioni che possono convalidare condizioni specifiche. I vincoli relativi al database sono integrità del dominio, integrità dell'entità, integrità referenziale, vincoli di integrità definita dall'utente ecc.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.