2

desc tableA コマンドからの次の出力を含む tableA があります。

+---------+-------------+------+-----+---------+----------------+
| Field   | Type        | Null | Key | Default | Extra          |
+---------+-------------+------+-----+---------+----------------+
| id      | int(11)     | NO   | PRI | NULL    | auto_increment |
| name    | varchar(50) | NO   |     |         |                |
| city    | varchar(50) | YES  |     | NULL    |                |
| state   | char(2)     | YES  |     | NULL    |                |
| country | varchar(30) | YES  |     | NULL    |                |
| notes   | longtext    | YES  |     | NULL    |                |
| type    | varchar(50) | NO   |     | NULL    |                |
+---------+-------------+------+-----+---------+----------------+

現在、NOT NULL 制約を持つ 3 つの列があります。

  1. ID
  2. 名前
  3. タイプ

列 ID と型については、デフォルトの制約を削除する必要があります。基本的には Default: None が欲しいです。回避策を使用したくありません。varchar のデフォルトを '' に設定します。

NULL、NONE、および '' の違いは、この議論からより明確になります。

コマンドを使用してみました:

alter table tableA alter column type drop default;

クエリは正常に実行されますが、影響を受ける行はありません。また、describe コマンドを実行しても、デフォルト値の変更は表示されません。

デフォルト値を '' に設定すると、別の問題が発生します。データベースでは、データベースに空の文字列を入力できます。私にとっては、列の値に NULL を挿入することと同等であり、それを許可したくありません。

空の文字列をデータベースのデータとして許可できないこの状況で、デフォルト値を処理する方法についてのガイダンスが必要です。受信データが空の文字列か NULL かを確認するために、コードに検証を入れることを計画していることに言及したいと思います。しかし、検証が機能しないなどの場合に備えて、DBがそのようなデータの追加を拒否できるようにしたいと考えています。

どんな助けでも本当に感謝しています。

4

1 に答える 1

0

列が null になる可能性がある場合、デフォルトまたは null は同じです。したがって、許可されたNull、デフォルトのnullは、言うときを除いて事実上無関係です

(name,city,type) 値を挿入 ('Fred',DEFAULT,'Caucasian')

Null は空の文字列ではありません。テーブルで null を許可しているのに、アプリケーションで空の文字列として解釈している場合、設計に厄介な欠陥があります。

そこに空の文字列を入れたくない場合は、通常、チェック制約を使用しますが、これは私の知る限り、まだ mysql に実装されていません。どうやら、この不足は通常、挿入トリガーで解決されます。したがって、トリガーの値を確認してから、空の文字列の挿入に失敗します。

PSそれは整合性の問題を解決しませんが、ひずみが空のときにnullを入れる方法が必要な場合は、空の文字列とnullを区別する必要はありません。

次に、nullif 関数を見てください。

于 2012-06-14T23:38:56.080 に答える