1

言い換えれば、言い換えさせてください。これは私のテーブルが説明されているものです。

    mysql> describe department;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| dnumber | int(1)      | NO   | PRI | NULL    |       |
| dname   | varchar(15) | YES  |     | NULL    |       |
| mgrssn  | varchar(9)  | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

これは私が私のテーブルを次のように説明するために必要なものです:

+--------------+-------------+------+-----+---------+
| Field        | Type        | Null | Key | Default |
+--------------+-------------+------+-----+---------+
| dnumber      | int(1)      | NO   | PRI | NOT NULL|
| dname        | varchar(15) | YES  |     | NULL    |
| mgrssn       | varchar(9) | YES  |     | NULL    |
+--------------+-------------+------+-----+---------+

デフォルトのdnumberを変更して、nullからnullにならないようにするにはどうすればよいですか?

4

1 に答える 1

1

はテーブルdnumberの主キーであるため、NULL 値を持つことはできません。department

では、実際に以下を挿入してみるとどうなるでしょうか。

INSERT INTO department(dname, mgrssn) VALUES ("test", "123456789");

挿入がエラーで失敗することが予想されます。しかし、いいえ、成功します (警告はありますが):

mysql> INSERT INTO department(dname, mgrssn) VALUES ("test", "123456789");
Query OK, 1 row affected, 1 warning (0.04 sec)

今何があったの?さて、 「NULL は NULL ではない」という MySQL の多くの落とし穴の 1 つであることが判明しました。今日の MySQL マニュアルには、ほぼ同じことが書かれています。

カラム定義に明示的な DEFAULT 値が含まれていない場合、MySQL はセクション11.5「データ型のデフォルト値」</a> で説明されているようにデフォルト値を決定します。

では、実際に何が挿入されたのでしょうか。見てみましょう:

mysql> select * from department;
+---------+-------+-----------+
| dnumber | dname | mgrssn    |
+---------+-------+-----------+
|       0 | test  | 123456789 |
+---------+-------+-----------+
1 row in set (0.00 sec)

ここで何が起こったかというと、MySQL は、暗黙のうちに に挿入しようとしていた挿入ステートメントを取得NULLdnumber、静かにそれを のデフォルト値INTまたは 0 に変換したということです。

また、 MySQL が ( PostgreSQLと比較して) これとその他の奇妙なことをより詳細に説明している非常に優れたビデオもあります。

最後に、もう 1 つアドバイスを追加させてください。これは主キーであるため、次のようdnumberに自動インクリメント列を作成することをお勧めします。

mysql> ALTER TABLE department MODIFY dnumber int(1) AUTO_INCREMENT;
Query OK, 1 row affected (0.27 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> desc department;
+---------+-------------+------+-----+---------+----------------+
| Field   | Type        | Null | Key | Default | Extra          |
+---------+-------------+------+-----+---------+----------------+
| dnumber | int(1)      | NO   | PRI | NULL    | auto_increment |
| dname   | varchar(15) | YES  |     | NULL    |                |
| mgrssn  | varchar(9)  | YES  |     | NULL    |                |
+---------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

そうすれば、将来の挿入は、重複キーエラーを引き起こすdepartmentために常に別の 0 を挿入しようとするわけではありませんがdnumber、代わりに、1、2、3 など、次に小さい利用可能な整数値を使用します。

お役に立てれば!

于 2012-11-30T03:27:52.857 に答える