Buscando restricción SQL: SELECCIONE EL CONTEO (*) de tBoss < 2
-
06-07-2019 - |
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
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