2011-12-14 10 views
3

こんにちは、私はウェブ開発の分野で全く新しい初心者です。私は1つだけのレコードを持つ管理者ログイン用のテーブルを作成したい(1人の管理者がいるため)。私は、特定のテーブルにレコードを1つしか持たせないようにMySQLを設定することは可能でしょうか?mysqlにレコードを1つだけ持つようにテーブルを制限することはできますか?

+1

このテーブルにインセットする際にトリガーを作成します。 – chance

+1

MySQLでは作成できません。あなたはなぜそれをしたいのか説明できますか? – pltvs

答えて

4

レコードをカウントするトリガー(具体的には挿入トリガー)を設定できます。カウントが1以上の場合は、挿入操作を許可しません。

http://dev.mysql.com/doc/refman/5.0/en/insert.htmlをチェックし、それに応じてロジックを設定してください。

1

これを行うには、データベース内の「1行を強制」よりもはるかに優れている方法がたくさんあります。

  1. ユーザーの表を作成し、その中にユーザーを管理者として識別するフラグを作成します。そして、あなたは、単に管理者のための1is_adminを設定し、管理者の検索

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

    :これは、のような単純なものでした

    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にrefernceを追加します。この方法では、このadminsテーブルに他のフラグとプロパティを設定することができます(後でusersテーブルに多くの列を追加するのではなく)。

+0

もう一つのアプローチを提案してくれてありがとうございました – pouya

+0

私は本当にそれに感銘を受けましたが、私のQの答えではなくはるかに良い戦略 – pouya

3

他の回答があなたの特定の質問へのより良いアプローチがあることが適切であるが、(唯一のケースとダミー列挙列を追加し、それをUNIQUE KEYを行うことにより、単一行のテーブルを作成することが可能ですまたはテーブルのPRIMARY KEY):

これは、列がしか単一の値を持つことができるので( ENUMは、単一のケースを持っている、と) NULLすることはできません、と UNIQUE(または PRIMARY)キーを強制する働き
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 | 
+-------------+---------------------+ 

テーブルのすべての行に列の値が異なります。

これは、0と任意の特定の行数との間にしか入ることのできない表を作成するために、実際の範囲のENUMまで拡張することができます。 MySQL 5.7の制限は実質的に255ケースですが、その点ではUNQIUE KEYTINYINT UNSIGNEDカラムに置き換えるほうが簡単です。しかし、私は表が 0またはN行のいずれかを強制する方法を見つけることができませんでした。この解決策では、「0とNとの間で」強制するだけです.MySQLは動作しません。CHECKという制約があります。 (この例では、同じ効果が達成されるようにNが1である当然の)

:記憶の余分なバイトを占有回避するために生成された仮想列を使用することができるように見えるかもしれないが制限付き列挙型の場合、残念ながら、MySQLやMariaDBのほとんどのバージョンでは、生成されたカラムに定数を使用できないため、またはデータベースを騙して許可するなどの理由で、さまざまなエラーが発生します(たとえば、GENERATED ALWAYS AS (LEAST(GREATEST(single_row_value,0),0)) VIRTUAL )、ストレージエンジンは仮想生成された列にインデックスを配置することを好まないためです。これは5.7.8からMySQLのInnoDBで動作することが文書化されていますが、この記事の執筆時点ではMariaDB 10.1ではうまくいきません。

編集する追加:これは絶対確実ではありません。 ENUMの「エラー」値はゼロであり、インデックスは1から開始するため、INSERT INTO only_one_row VALUES (0,...); INSERT INTO only_one_row VALUES (1,...);は成功します。しかし、この状態は通常の操作では起こりそうもなく、トリガーよりも追跡するのがさらに簡単です!

+0

偉大な答え。 1つの行テーブルは、永続的なユーザー定義変数が必要な場合に便利です。 – Peter

関連する問題