Alla ricerca del vincolo SQL: SELEZIONA COUNT (*) da tBoss < 2
-
06-07-2019 - |
Domanda
Vorrei limitare le voci in una tabella. Diciamo nella tabella tBoss . Esiste un vincolo SQL che controlla quante tuple sono attualmente nella tabella? Come
SELECT COUNT(*) from tBoss < 2
Firebird dice:
Token non valido. Errore SQL dinamico. Codice di errore SQL = -104. Token sconosciuto - riga 3, colonna 8. SELEZIONE.
Grazie. Norbert
Soluzione
Il tuo database ha trigger? In tal caso, aggiungi un trigger che ripristina qualsiasi inserimento che aggiungerebbe più di 2 righe ...
Create Trigger MyTrigName
For Insert On tBoss
As
If (Select Count(*) From tBoss) > 2
RollBack Transaction
ma per rispondere direttamente alla tua domanda, il predicato che vuoi è semplicemente mettere la sottoquery selezionata tra parentesi. come questo ...
[First part of sql statement ]
Where (SELECT COUNT(*) from tBoss) < 2
Altri suggerimenti
Puoi farlo con un vincolo di controllo e una funzione scalare. Ecco come ho creato un campione.
Innanzitutto, crea una tabella:
CREATE TABLE MyTable
(
MyTableId int not null identity(1,1)
,MyName varchar(100) not null
)
Quindi crea una funzione per quella tabella. (Potresti aggiungere il limite del conteggio delle righe come parametro se desideri maggiore flessibilità.)
CREATE FUNCTION dbo.MyTableRowCount()
RETURNS int
AS
BEGIN
DECLARE @HowMany int
SELECT @HowMany = count(*)
from MyTable
RETURN @HowMany
END
Ora aggiungi un vincolo check usando questa funzione alla tabella
ALTER TABLE MyTable
add constraint CK_MyTable__TwoRowsMax
check (dbo.MyTableRowCount() < 3)
E testalo:
INSERT MyTable (MyName) values ('Row one')
INSERT MyTable (MyName) values ('Row two')
INSERT MyTable (MyName) values ('Row three')
INSERT MyTable (MyName) values ('Row four')
Uno svantaggio è che ogni volta che si inserisce nella tabella, è necessario eseguire la funzione ed eseguire una scansione della tabella ... ma quindi, la tabella (con indice cluster) occupa due pagine al massimo. Il vero svantaggio è che sembra un po 'sciocco ... ma tutto sembra sciocco quando non capisci perché deve essere così.
(La soluzione di trigger funzionerebbe, ma mi piace evitare i trigger quando possibile.)
Per trovare multipli in un database, la tua scommessa migliore è una sottoquery, ad esempio: (Nota: suppongo che tu stia cercando di trovare file duplicate di qualche tipo)
SELEZIONA ID DA tBoss DOVE ID IN (SELEZIONA ID DA tBoss GROUP PER ID CON CONTATTO (*) > 1)
dove id è la colonna forse duplicata
SELECT COUNT(*) FROM tBoss WHERE someField < 2 GROUP BY someUniqueField