Можно ли ограничить таблицу, чтобы иметь только одну запись в MySQL? - PullRequest
4 голосов
/ 14 декабря 2011

Привет, я новичок в области веб-разработки.Я хочу создать таблицу для входа в систему администратора, которая имеет только одну запись (потому что есть только один администратор).Я хочу знать, можно ли как-то настроить MySQL, чтобы ограничить специальную таблицу только одной записью?

Ответы [ 3 ]

5 голосов
/ 18 января 2016

В то время как другие ответы верны, что существуют лучшие подходы к вашему конкретному вопросу, можно создать таблицу из одной строки, добавив фиктивный столбец перечисления только с одним регистром и сделав его UNIQUE KEY (илиPRIMARY KEY) таблицы:

mysql> CREATE TABLE only_one_row (
    restriction ENUM('') NOT NULL,
    single_row_value DATETIME NOT NULL,
    PRIMARY KEY (restriction)
);
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO only_one_row (single_row_value) VALUES (NOW());
Query OK, 1 rows affected (0.00 sec)

mysql> INSERT INTO only_one_row (single_row_value) VALUES ('2016-01-01');
ERROR 1062 (23000): Duplicate entry '' for key 'PRIMARY"

mysql> SELECT * FROM only_one_row;
+-------------+---------------------+
| restriction | single_row_value    |
+-------------+---------------------+
|             | 2016-01-01 00:00:00 |
+-------------+---------------------+

Это работает, потому что столбец может иметь только одно значение (ENUM имеет только один регистр и не может быть NULL), а *Клавиша 1008 * (или PRIMARY) заставляет каждую строку в таблице иметь различное значение для столбца.

Это может быть расширено очевидным образом для создания таблиц, которые могут содержать только от 0 до любогоопределенное количество строк, вплоть до практических ограничений ENUM.Предел в MySQL 5.7 фактически составляет 255 случаев, но к этому моменту было бы легче взять вместо UNQIUE KEY столбец TINYINT UNSIGNED.Однако я не смог найти способ обеспечить, чтобы в таблице было или 0 или N строк;это решение будет применять только «от 0 до N», так как MySQL не имеет рабочих ограничений CHECK.(Конечно, где N - единица, как в этом примере, достигается тот же эффект.)

Примечание : хотя может показаться возможным использовать сгенерированный виртуальный столбец дляизбегайте использования дополнительного байта памяти для ограничительного перечисления, к сожалению, большинство версий MySQL и MariaDB будут выдавать различные ошибки, если вы попробуете это, либо потому, что постоянное значение не может использоваться для сгенерированного столбца, либо если вы обманываете базу данных вэто разрешено (например, с использованием GENERATED ALWAYS AS (LEAST(GREATEST(single_row_value,0),0)) VIRTUAL), потому что механизмам хранения не нравится размещать индексы в виртуальных сгенерированных столбцах.Это задокументировано для работы с InnoDB в MySQL начиная с версии 5.7.8, но это точно не работает в MariaDB 10.1 на момент написания этой статьи.

Отредактировано, чтобы добавить: Это не надежно.Значение «error» для ENUM равно нулю, а индексы начинаются с единицы, поэтому INSERT INTO only_one_row VALUES (0,...); INSERT INTO only_one_row VALUES (1,...); будет успешным.Тем не менее, это условие вряд ли возникнет при нормальной работе, и все еще легче отслеживать, чем триггер!

5 голосов
/ 14 декабря 2011

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

Проверьте http://dev.mysql.com/doc/refman/5.0/en/insert.html и настройте свою логику соответственно.

1 голос
/ 14 декабря 2011

Есть много способов сделать это, которые намного лучше, чем «форсировать одну строку» в базе данных.

  1. Создайте таблицу пользователя и в ней создайте поле, являющееся флагом, который идентифицирует пользователя как администратора. Это может быть так просто, как:

    create table users (id int not null primary key auto_increment, name varchar(20), is_admin bool default 0);

    Затем вы просто устанавливаете is_admin на 1 для администратора и ищете администратора:

    select id,name from users where is_admin;

    Все пользователи, которые не являются администраторами:

    select id,name from users where not is_admin;

  2. Создайте еще одну таблицу, которая идентифицирует пользователя как администратора, используя отношение внешнего ключа.

    create table users (id int not null auto_increment primary key, name varchar(25));

    create table admins (id int not null auto_incrememnt primary key, userid int, foreign key (userid) references users(id));

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

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