Pergunta

Eu gostaria de limitar as entradas em uma tabela. Vamos dizer na tabela tBoss . Existe uma restrição de SQL que verifica quantos tuplas estão actualmente em cima da mesa? Como

SELECT COUNT(*) from tBoss < 2

Firebird diz:

símbolo inválido. Erro dinâmico SQL. código de erro SQL = -104. Token desconhecido - linha 3, coluna 8. SELECT.

Graças. Norbert

Foi útil?

Solução

Será que o seu banco de dados tem gatilhos? Se assim for, Adicionar um gatilho que desfaz qualquer inserção que iria adicionar mais de 2 linhas ...

Create Trigger MyTrigName
For Insert On tBoss
As
    If (Select Count(*) From tBoss) > 2
       RollBack Transaction

Mas, para responder sua pergunta diretamente, o predicado que você quer é apenas colocar a subconsulta selecione entre parênteses. assim ...

  [First part of sql statement ]
  Where (SELECT COUNT(*) from tBoss) < 2

Outras dicas

Você pode fazer isso com uma restrição de verificação e uma função escalar. Veja como eu construí uma amostra.

Em primeiro lugar, criar uma tabela:

CREATE TABLE MyTable
 (
   MyTableId  int           not null  identity(1,1)
  ,MyName     varchar(100)  not null
 )

Em seguida, crie uma função para essa tabela. (Você poderia talvez adicionar o limite de contagem de linha como parâmetros de se você quiser mais flexibilidade.)

CREATE FUNCTION dbo.MyTableRowCount()
RETURNS int
AS
 BEGIN
    DECLARE @HowMany int

    SELECT @HowMany = count(*)
      from MyTable
    RETURN @HowMany
 END

Agora, adicione uma restrição de verificação usando esta função para a mesa

ALTER TABLE MyTable
 add constraint CK_MyTable__TwoRowsMax
  check (dbo.MyTableRowCount() < 3)

e testá-lo:

INSERT MyTable (MyName) values ('Row one')
INSERT MyTable (MyName) values ('Row two')
INSERT MyTable (MyName) values ('Row three')
INSERT MyTable (MyName) values ('Row four')

A desvantagem é que cada vez que você inserir a tabela, você tem que executar a função e realizar uma varredura da tabela ... mas e daí, a tabela (com índice de cluster) ocupa duas páginas no máximo. A desvantagem real é que ele parece meio bobo ... mas tudo parece pateta quando você não entender por tem que ser assim.

(A solução gatilho iria funcionar, mas eu gosto de gatilhos Evitar sempre que possível).

Para múltiplos em um banco de dados a sua melhor aposta é uma sub-consulta por exemplo: (Nota Estou assumindo que você está olhando para encontrar registros duplicados de algum tipo)

id SELECT FROM tBoss ONDE id (id SELECT FROM tBoss GROUP BY id TENDO count (*)> 1)

onde id é a coluna possivelmente duplicado

SELECT COUNT(*) FROM tBoss WHERE someField < 2 GROUP BY someUniqueField
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top