Требуется ограничение SQL: SELECT COUNT (*) из tBoss <2 - PullRequest
0 голосов
/ 27 октября 2009

Я хотел бы ограничить записи в таблице. Допустим, в таблице tBoss . Есть ли ограничение SQL, которое проверяет, сколько кортежей в настоящее время находится в таблице? Как

SELECT COUNT(*) from tBoss < 2

Жар-птица говорит:

Неверный токен. Ошибка динамического SQL. Код ошибки SQL = -104. Токен неизвестен - строка 3, столбец 8. SELECT.

Спасибо. Норберт

Ответы [ 4 ]

5 голосов
/ 27 октября 2009

Вы можете сделать это с помощью проверочного ограничения и скалярной функции. Вот как я построил образец.

Сначала создайте таблицу:

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

Затем создайте функцию для этой таблицы. (Вы можете добавить предел количества строк в качестве параметров, если вам нужна большая гибкость.)

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

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

Теперь добавьте проверочное ограничение с помощью этой функции в таблицу

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

И проверить это:

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

Недостатком является то, что каждый раз, когда вы вставляете в таблицу, вы должны запускать функцию и выполнять сканирование таблицы ... но что же, таблица (с кластеризованным индексом) занимает максимум две страницы. Реальный недостаток в том, что это выглядит глупо ... но все выглядит глупо, когда вы не понимаете почему так и должно быть.

(Триггерное решение будет работать, но я бы хотел избегать триггеров при любой возможности.)

5 голосов
/ 27 октября 2009

Есть ли в вашей базе данных триггеры? Если это так, добавьте триггер, который откатывает любую вставку, которая добавит более 2 строк ...

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

но чтобы ответить на ваш вопрос напрямую, предикат, который вы хотите, - это просто поместить подзапрос select в скобки. как это ...

  [First part of sql statement ]
  Where (SELECT COUNT(*) from tBoss) < 2
1 голос
/ 27 октября 2009

Чтобы найти мультипликаторы в базе данных, лучше всего подзапросом использовать следующий запрос: (Обратите внимание, я предполагаю, что вы ищете дубликаты строк)

ВЫБРАТЬ идентификатор из tBoss, ГДЕ ИДЕНТИФИКАТОР (ВЫБРАТЬ идентификатор из tBoss ГРУППЫ ПО ИДЕНТИФИКАТОРУ СЧЕТА (*)> 1)

где id - возможно дублированный столбец

0 голосов
/ 27 октября 2009
SELECT COUNT(*) FROM tBoss WHERE someField < 2 GROUP BY someUniqueField
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...