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

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top