Pregunta

Me gustaría limitar las entradas en una tabla. Digamos en la tabla tBoss . ¿Existe una restricción de SQL que verifique cuántas tuplas hay actualmente en la tabla? Me gusta

SELECT COUNT(*) from tBoss < 2

Firebird dice:

  

Token inválido.   Error dinámico de SQL.   Código de error SQL = -104.   Token desconocido - línea 3, columna 8.   SELECCIONAR.

Gracias. Norbert

¿Fue útil?

Solución

¿Su base de datos tiene disparadores? Si es así, agregue un disparador que revierta cualquier inserción que agregaría más de 2 filas ...

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

pero para responder su pregunta directamente, el predicado que desea es simplemente colocar la subconsulta select dentro de paréntesis. así ...

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

Otros consejos

Puede hacer esto con una restricción de verificación y una función escalar. Así es como construí una muestra.

Primero, cree una tabla:

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

Luego crea una función para esa tabla. (Tal vez podría agregar el límite de recuento de filas como parámetros si desea más flexibilidad).

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

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

Ahora agregue una restricción de verificación usando esta función a la tabla

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

Y pruébalo:

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

Una desventaja es que cada vez que inserta en la tabla, debe ejecutar la función y realizar un escaneo de la tabla ... pero qué, la tabla (con índice agrupado) ocupa dos páginas como máximo. La verdadera desventaja es que se ve un poco tonto ... pero todo se ve tonto cuando no entiendes por qué tiene que ser así.

(La solución de disparo funcionaría, pero me gusta evitar los disparadores siempre que sea posible).

Para encontrar múltiplos en una base de datos, su mejor opción es una subconsulta, por ejemplo: (Tenga en cuenta que supongo que está buscando encontrar filas duplicadas de algún tipo)

  

SELECCIONE ID de tBoss DONDE ID (SELECCIONE ID de tBoss GROUP POR ID QUE TIENE conteo (*) > 1)

donde id es la columna posiblemente duplicada

SELECT COUNT(*) FROM tBoss WHERE someField < 2 GROUP BY someUniqueField
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top