sql >> データベース >  >> RDS >> Mysql

mysql2sqlite.sh Auto_Increment

    AUTO_INCREMENT キーワードはMySQLに固有です。

    SQLiteにはキーワードAUTOINCREMENTがあります (アンダースコアなし)これは、列が、テーブルでこれまで使用されたことのない単調に増加する値を自動生成することを意味します。

    AUTOINCREMENTを省略した場合 キーワード(現在表示しているスクリプトのように)、SQLiteはROWIDを新しい行に割り当てます。これは、テーブル内の現在の最大のROWIDよりも1大きい値になることを意味します。これにより、テーブルの上限から行を削除してから新しい行を挿入すると、値が再利用される可能性があります。

    http://www.sqlite.org/autoinc.html を参照してください。 詳細については。

    このスクリプトを変更してAUTOINCREMENTを追加する場合 キーワード、この行を変更できるようです:

    gsub( /AUTO_INCREMENT|auto_increment/, "" )
    

    これに:

    gsub( /AUTO_INCREMENT|auto_increment/, "AUTOINCREMENT" )
    

    コメントを再確認してください:

    さて、sqlite3を使用してダミーテーブルで試してみました。

    sqlite> create table foo ( 
      i int autoincrement, 
      primary key (i)
    );
    Error: near "autoincrement": syntax error
    

    どうやらSQLiteはautoincrementを必要とします 列レベルに従ってください 主キーの制約。テーブルレベルの制約として、最後にpk制約を配置するというMySQLの規則には満足していません。これは、SQLite CREATETABLEのドキュメント の構文図でサポートされています。 。

    primary keyを入れてみましょう autoincrementの前 。

    sqlite> create table foo ( 
      i int primary key autoincrement
    );
    Error: AUTOINCREMENT is only allowed on an INTEGER PRIMARY KEY
    

    そして明らかにSQLiteは「INT」が好きではなく、「INTEGER」を好みます:

    sqlite> create table foo (
      i integer primary key autoincrement
    );
    sqlite>
    

    成功!

    そのため、awkスクリプトはMySQLテーブルDDLをSQLiteに簡単に変換できません。

    コメントを再確認してください:

    SQL ::Translater 、これは大変な作業です。完全に機能するスクリプトを作成するつもりはありません。

    これを実際に解決し、すべての構文変更を自動化してDDLをSQLiteと互換性のあるものにすることができるスクリプトを作成するには、SQLDDL用の完全なパーサーを実装する必要があります。これをawkで行うのは実用的ではありません。

    スクリプトを一部に使用することをお勧めします キーワード置換の場合の例を示し、さらに変更が必要な場合は、テキストエディタで手動で修正します。

    また、妥協することを検討してください。 AUTOINCREMENTを使用するためにDDLを再フォーマットするのが難しすぎる場合 SQLiteの機能については、デフォルトのROWID機能が十分に近いかどうかを検討してください。違いを理解するには、上記のリンクを読んでください。



    1. MysqlデータをExcelダウンロードにエクスポートするときに2つのテーブルを結合/結合する方法は?

    2. 書き込み可能なパーティションへの変更が予期せず失敗する可能性があります

    3. 基数10から基数26までは文字のみで、26はaaになります

    4. MySQLで何年にもわたって実行またはストリークを計算する