こんにちは、私はウェブ開発の分野で全く新しい初心者です。私は1つだけのレコードを持つ管理者ログイン用のテーブルを作成したい(1人の管理者がいるため)。私は、特定のテーブルにレコードを1つしか持たせないようにMySQLを設定することは可能でしょうか?mysqlにレコードを1つだけ持つようにテーブルを制限することはできますか?
答えて
レコードをカウントするトリガー(具体的には挿入トリガー)を設定できます。カウントが1以上の場合は、挿入操作を許可しません。
http://dev.mysql.com/doc/refman/5.0/en/insert.htmlをチェックし、それに応じてロジックを設定してください。
これを行うには、データベース内の「1行を強制」よりもはるかに優れている方法がたくさんあります。
ユーザーの表を作成し、その中にユーザーを管理者として識別するフラグを作成します。そして、あなたは、単に管理者のための
1
にis_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;
外部キー関係を使用してユーザーを管理者として識別する別の表を作成します。
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
テーブルに多くの列を追加するのではなく)。
他の回答があなたの特定の質問へのより良いアプローチがあることが適切であるが、(唯一のケースとダミー列挙列を追加し、それを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 KEY
をTINYINT 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,...);
は成功します。しかし、この状態は通常の操作では起こりそうもなく、トリガーよりも追跡するのがさらに簡単です!
偉大な答え。 1つの行テーブルは、永続的なユーザー定義変数が必要な場合に便利です。 – Peter
- 1. mysqlテーブルをn行だけに制限することはできますか?
- 2. MySQL - 他のテーブルで1つだけの結果または制限に参加する
- 3. 制限付きメモリを持つバイナリツリーで最初にnullを見つけよう
- 4. shinyTreeのチェックボックスを1つだけに制限する方法R
- 5. 子テーブルからレコードを1つだけ取得する
- 6. どのようにデータベース内の行を1つに制限できますか?
- 7. ActiveRecord:特定の属性値を持つレコードは1つだけですか?
- 8. データベースにレコードを1回だけ追加することはできますか?
- 9. DB2でレコードを1つだけ更新するには?
- 10. 削除行とだけ私はこのようなレコードを持つテーブル持って
- 11. APSchedulerを100回だけ実行するように制限できますか?
- 12. 1日に1回だけ遊ぶようにユーザを制限する
- 13. JVMリモートデバッグポートを1つのリモートホストだけに開くことはできますか?
- 14. 2つの列でMySQLのORDERを1つに制限
- 15. Laravelデータベースクエリビルダfind ::レコードを1つだけ持つ
- 16. ローテーションを1つのView Controllerだけに制限する方法は?
- 17. 1つのテストで1ページだけマウスオーバーを行うことができます
- 18. ボタンを1つだけ押すことができます
- 19. Pythonスクリプトを1つの引数だけを受け入れるように制限するにはどうすればよいですか? (argparse)
- 20. 1つのXIBに2つのテーブルビューを持つことはできますか?
- 21. MySql重複レコードのうちの1つだけを更新します
- 22. 別のテーブルに2つの特定のレコードを持つレコードを見つける
- 23. MySql:1つのテーブル内の1つの列に対する更新アクセス許可を制限する
- 24. MySQLは、テーブル2に一致するレコードが見つかると、データをテーブル1に挿入します。
- 25. MSTestを持つTestResultフォルダは1つだけですか?
- 26. RMIを1つのポートに制限することの含意
- 27. クエリを1つのレコードに制限するとパフォーマンスが向上する
- 28. 特定の属性を持つmysqlレコードの数を制限する
- 29. mysqlテーブルに異なる値を持つレコードが重複する
- 30. 複数回のクリックでも1つのインスタンスだけを実行するようにMSIインストーラを制限するにはどうすればよいですか?
このテーブルにインセットする際にトリガーを作成します。 – chance
MySQLでは作成できません。あなたはなぜそれをしたいのか説明できますか? – pltvs