Как я могу убедиться, что в таблице БД есть одна-единственная строка? - PullRequest
5 голосов
/ 17 января 2011

Я хотел бы убедиться, что в моей таблице MySQL с именем "myTable" есть строка "одна-единственная-одна".

Так что мне нужно иметь возможность выполнять обновление этой строки, но, очевидно, вставка и удаление должныбыть невозможным.

Я задаю этот вопрос из-за этого Ответа переполнения стека

Спасибо!

Ответы [ 8 ]

7 голосов
/ 02 сентября 2015
CREATE TABLE `myTable` (
  `id` enum('1') NOT NULL,
  `MyValue1` int(6) DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='The ENUM(''1'') construct as primary key is used to prevent that more than one row can be entered to the table';
3 голосов
/ 17 января 2011

Два предложения для вас, одно или оба, которые могут работать в зависимости от данных, которые вы пытаетесь сохранить:

  • Посмотрите, будут ли работать ограничения ENUM или SET; обратите внимание, что они предлагают разные уровни применения в зависимости от режима SQL (например, строгий). Смотрите больше информации:

    http://dev.mysql.com/doc/refman/5.0/en/constraint-invalid-data.html

И / ИЛИ

  • Реализация триггеров INSERT, UPDATE и DELETE для управления доступом к данным (может потребоваться заполнить данные изначально, прежде чем создавать их; опять же, это зависит от вашего сценария)

    http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html

2 голосов
/ 18 ноября 2016

Самый простой подход - создать столбец, который имеет только одно допустимое значение, а затем объявить его not null unique.

Это заставляет таблицу иметь не более одну строку, но все равно допускает ноль строк. Если вам нужно предотвратить удаление единственной строки, используйте подход триггера, приведенный в другом ответе.

create table example( 
    enforce_one_row enum('only') not null unique default 'only',
    ... your columns ....
);
1 голос
/ 17 января 2011

Попробуйте это:

CREATE TABLE foo (x INT NOT NULL PRIMARY KEY CHECK (x = 1), col1 INT NOT NULL, col2 INT NOT NULL);
0 голосов
/ 10 июня 2014
    create table if not exists myTable (
        ID int not null
    ) engine=innodb;

    select 'create trigger tbi_myTable';
    drop trigger if exists tbi_myTable;
    delimiter //
    create trigger tbi_myTable 
        before insert on myTable 
        for each row
    begin
        if (select count(1) from myTable) > 0 then
            -- Signal is only in 5.6 and above use another way to raise an error: if less than 5.6
            SIGNAL SQLSTATE '50000' SET MESSAGE_TEXT = 'Cannot insert into myTable only one row alowed!';
        end if;
    END //
    delimiter ;
    insert into myTable values (1);

    <b>-- This will generate an error</b>
    insert into myTable values (2);

    <b>-- This will only have one row with "1"</b>
    select * from myTable;
0 голосов
/ 14 декабря 2011

Если ваша база данных установлена ​​в «строгий» режим, вы можете создать такую ​​таблицу:

создать таблицу foo (id enum ('SYSROW') не ноль, (другие определения столбцов) первичный ключ (id));

0 голосов
/ 17 января 2011

Вы можете проверить в MySQL, используя оператор IF.

0 голосов
/ 17 января 2011

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

сначала вставьте одну-единственную запись затем добавьте в привилегии путем отключения INSERT, UPDATE, DROP в столбце table_priv

mysql> desc tables_priv;
+-------------+-------------------------------------------------------------------------------------------------------------------------+------+-----+-------------------+-------+
| Field       | Type                                                                                                                    | Null | Key | Default           | Extra |
+-------------+-------------------------------------------------------------------------------------------------------------------------+------+-----+-------------------+-------+
| Host        | char(60)                                                                                                                | NO   | PRI |                   |       |
| Db          | char(64)                                                                                                                | NO   | PRI |                   |       |
| User        | char(16)                                                                                                                | NO   | PRI |                   |       |
| Table_name  | char(64)                                                                                                                | NO   | PRI |                   |       |
| Grantor     | char(77)                                                                                                                | NO   | MUL |                   |       |
| Timestamp   | timestamp                                                                                                               | NO   |     | CURRENT_TIMESTAMP |       |
| Table_priv  | set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter','Create View','Show view') | NO   |     |                   |       |
| Column_priv | set('Select','Insert','Update','References')                                                                            | NO   |     |                   |       |
+-------------+-------------------------------------------------------------------------------------------------------------------------+------+-----+-------------------+-------+
8 rows in set (0.00 sec)
...