Любой способ обеспечить ограничение числового первичного ключа размера в SQL? - PullRequest
1 голос
/ 29 октября 2008

Я хотел бы создать таблицу с целочисленным первичным ключом, ограниченным между 000 и 999. Есть ли способ применить этот трехзначный лимит в пределах sql?

Я использую sqlite3. Спасибо.

Ответы [ 7 ]

2 голосов
/ 29 октября 2008

SQLite поддерживает два способа сделать это:

Определение ограничения CHECK для столбца первичного ключа:

CREATE TABLE mytable (
  mytable_id INT PRIMARY KEY CHECK (mytable_id BETWEEN 0 and 999)
);

Создайте триггер в таблице, который отменяет любые INSERT или UPDATE, которые пытаются установить для столбца первичного ключа значение, которое вам не нужно.

CREATE TRIGGER mytable_pk_enforcement
BEFORE INSERT ON mytable
FOR EACH ROW 
  WHEN mytable_id NOT BETWEEN 0 AND 999
BEGIN
  RAISE(ABORT, 'primary key out of range');
END

Если вы используете автоматически назначенный первичный ключ, как показано выше, вам может потребоваться запустить триггер AFTER INSERT вместо вставки. Значение первичного ключа еще не может быть сгенерировано во время выполнения триггера BEFORE.

Возможно, вам также понадобится написать триггер на UPDATE, чтобы люди не могли изменить значение вне диапазона. По существу, ограничение CHECK предпочтительнее, если вы используете SQLite 3.3 или более позднюю версию.

примечание: Я не проверял код выше.

1 голос
/ 29 октября 2008

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

Почему вы хотите ограничить первичный ключ до 1000 возможных значений? Что происходит, когда вам нужно 1500 записей в таблице? Это не кажется мне очень хорошей вещью, даже пытаться делать.

1 голос
/ 29 октября 2008

Вы можете сделать это, используя ограничение CHECK.

Но,

Ограничения CHECK поддерживаются начиная с версии 3.3.0. До версии 3.3.0 ограничения CHECK анализировались, но не применялись.

(из здесь )

Так что, если SQLite 3 = SQLite 3.3, это, вероятно, не будет работать

0 голосов
/ 04 ноября 2008

Как насчет предварительного заполнения таблицы 1000 строк в начале. Переключите доступные строки с помощью некоторого столбца 1/0, например Is_Available или аналогичного. Тогда не допускайте вставки или удаления, только обновления. В этом случае ваше приложение должно быть закодировано только для обновлений.

0 голосов
/ 29 октября 2008

Почему это целое число? Вы сказали, что это было между 000 и 999, так что, похоже, вы на самом деле не вычисляете целое число.

Если вы не занимаетесь арифметикой, используйте символы.

0 голосов
/ 29 октября 2008

HLGEM, вы, вероятно, правы. Я пытался применить это, потому что этот ключ является частью большего 7-значного кода, который я не могу позволить увеличить. Вероятно, эта таблица не достигнет 500 строк через пару лет, поскольку она предназначена для небольшого магазина. Будем надеяться, что до тех пор они могут позволить себе получать RFID.

0 голосов
/ 29 октября 2008

Действительно, используя ограничение CHECK, он не допустит числа вне этого диапазона, но это не сработало точно так, как я хотел (и я сожалею, что не упомянул это), потому что я хотел, чтобы он использовал первый доступный первичный ключ (освобождается удаленными строками) после того, как он попробует 1000-й ключ.

Спасибо за ответы, я посмотрю на опцию TRIGGER.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...