インポートmysqlのデータが示唆するとフィールドIDは、デフォルト値のソリューションを持っていません

より転載:

https://www.cnblogs.com/os-python/p/6773499.html  

https://www.jb51.net/article/42883.htm

-------------------------------------------------- -------------------------------------------------

  • プロジェクトでは、ジャンゴ+ MySQLを使用しています
  • Linuxの中で使用されるmysql5.7で、データをインポート勧め:フィールド*はデフォルト値はありません。
  • あなたはmysql5.7に知っておく必要がある問題を解決したい、厳密モードが有効になります。
  • /etc/mysql/my.cnf設定ファイルで見つかりました:
  • SQL-モデル= STRICT_TRANS_TABLES、NO_AUTO_CREATE_USER、NO_ENGINE_SUBSTITUTION
  • 修改为:sql-mode=NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
  • その後、データベースにMySQLの、再同期モデルを再起動します

この問題は、その理由を発生します。

  1. mysql5.0.2前では、MySQLは検査の値は、データ入力のため、違法であるにそれらを有効値に強制変換に厳しいではありません。
  2. 将来のリリースでは5.0.2は、以前のデフォルトの動作を保持しますが、サーバーがステートメントと貧しい値発生をあきらめることを拒否することができるように、より伝統的なアプローチの値は、悪い選択することができます。

MySQLのデフォルトの動作と厳格な新しいSQLモードとの違い:

  1. あなたがstrictモードを使用していない場合は、次のような状況では合法です。こうした数値カラムへの非NULL列にNULL値、または特大のデータなどの列に正しくない値、場合、mysqlのではなく、エラーメッセージを投げるよりも、最も可能性の高い値として列を設定します。
  2. ビューは、数値列に値の範囲に渡って保存されている場合、MySQLサーバは0(最小可能値)の代わりに、または可能な最大値を保存します。
  3. 文字列、MySQLの店舗のいずれか、空の文字列の場合、または文字列は、列の複数の部分を保存することがあります。
  4. あなたが数値カラムに文字列値の先頭に保存されません予定している場合、MySQLは0を保存します。
  5. MySQLが間違った日付とDATEのDATETIME列に特定の値を保存することができます(例:「2000年2月31日」または「2000-02-00」)。アイデアは、代わりに、SQL Serverの値の日付を確認することです。MySQLは、日付値を格納し、まったく同じ値を取得することができた場合、MySQLはそれの与えられた値を保存することができます。日付が間違っている場合(それを格納するサーバの能力外)の代わりに列に「0000-00-00」を特殊な日付値を保存します。
  6. ビューは、単一行のINSERTステートメントのNULL値を受け入れない列にNULL値を保存すると、エラーが発生します。複数行のINSERTステートメントのかに挿入... select文、MySQLサーバは、列のデータ型の暗黙のデフォルト値を格納します。一般に、数値タイプの場合、それは文字列型のため、ゼロであり、空の文字列(「」)、タイプの日付と時間「ゼロ」。
  7. カラム定義が明示的にデフォルトの句が含まれる場合は、列の値を指定しない文を挿入した場合、MySQLはデフォルト値を挿入します。定義には、このようなデフォルトの句は、mysqlの暗黙的に挿入された列のデータ型をデフォルトしない場合。
  8. 文が開始する前に、その前に説明した規則を使用する理由は、これらの条件をチェックすることはできません。あなたが快適なフライトを更新した後、この問題が発生した場合、ストレージエンジンは、ロールバックをサポートしていない可能性があるため、私たちは、ロールバックすることはできません。植栽文は、この場合には、更新はおそらく最悪のシナリオである完全なA「半分」、で、良い選択ではありません。この例では、より良いアプローチは何がそう続ける起こらなかったかのように「可能なベストを尽くす」ことです。

将来のバージョン5.0.2 MySQLでは、あなたは、STRICT_TRANS_TABLESやSTRICT_ALL_TABLES SQLモードを使用するより厳格なアプローチを選択することができます。

STRICT_TRANS_TABLESは動作します:

  1. 物事のストレージエンジンの場合は、どこかのステートメント値Junhuiにおける不良データは、文は中止し、ロールバックする原因となります。
  2. 物事の不揮発性ストレージエンジンのために、何かがうまくいかない場合は、最初の行と、文がアボート挿入または更新します。(この場合、文はちょうど同じことの表のように、テーブルを変更しないとみなすことができます)。最初の行は、文を実行見送るためにはつながらないの後にエラーが発生します。代わりに、不良データ値は警告ではなく、誤差を調整し、そしてします。つまり、STRICT_TRANS_TABLESの使用は、mysqlのエラー値は、ロールバック操作は、可能な場合は、すべての更新がこれまで行ってしまいます。

より厳格なチェックを実行するには、STRICT_ALL_TABLESを有効にします。非トランザクションストレージエンジンに加えて、それは、さらに最初の行を次の行の不正なデータのために、同等のSTRICT_TRANS_TABLES放棄するステートメントを実行することによって生成されたエラーにつながる可能性があります。これは、エラーが非トランザクションテーブルで発生した場合、または更新処理中に複数の行を挿入する場合、更新は、唯一の部分的な結果であるフロント行が挿入または更新される完了が、エラーの行動の背後にあるポイントではないことを意味します。非トランザクションテーブルの場合は、起きてからこれを避けるために、単一のステートメントを使用することができ、またはエラーではなく、エネルギー変換の警告はSTRICT_TRANS_TABLESで使用されています。問題の最初のケースの出現を防ぐために、列の内容をチェックするためにMySQLを使用しないでください。最も安全な方法は、アプリケーションが責任を負うようにすることですデータベースにのみ有効な値を渡します。

あなたがstrictモードのオプションを持っていたら、挿入を使用するか、無視するのではなく、無視することなく、挿入または更新を無視更新すると、警告としてエラーを扱います。

上記の動作が解決しないされた後、それはMySQLの設定の問題ではありません。

  1. それはあなたが操作したいデータベーステーブルに接続されていない場合、表に見ます
  2. テーブルIDが増分を設定されていません作成する(前のMySQLとの接触を持っていたので、それは私のミスですので、このエラーはカリキュラムは、学生が知って来るべきことがある)場合には、あります
  • あなたがテーブルを作成するときに追加します。テーブルtable1作成(ID int型AUTO_INCREMENT、主キーを、...)
  • あなたが作成した後、テーブルが追加さ:テーブルtable1は、ID int型のAUTO_INCREMENTを追加変更(TABLE1テーブル名であり、主キーのインクリメントフィールド、主キーを設定してください。)
  • 何度もテーブルIDのデータが最初からID 10000、QQのように、1から開始していない願っています:テーブルのユーザーを変更AUTO_INCREMENT = 10000;
  • そして声明はまた、削除する大量のデータとして、既存のテーブルを変更し、IDに適用され、最初からID 654321 123456を返したい:= 123456表のユーザーAUTO_INCREMENTを改変すること。

 

おすすめ

転載: blog.csdn.net/liuhongbin2011net/article/details/89632861