Sequelize bulkCreate:updateOnDuplicate

时间:2017-06-14 07:21:39

标签: mysql node.js sequelize.js

我正在向数据库输入大量数据,我正在使用此模型将updateOnDuplicate选项应用于bulkCreate。所以我无法在这里验证理智。我的问题是,因为我使用它的唯一值也可用于updateOnDuplicate标准,或者只是用于检查重复项的主键。

问题是我的表中的主键是bulkCreate是id,它是自动增量。我的模型中有多个唯一值,并且不希望在检查主键时更新任何内容。它是否考虑了所有独特的内容,还是我必须手动完成?

    customer_id: {
      type: DataTypes.BIGINT,
      allowNull: false,
      unique: true
    },
    shop_id: {
      type: DataTypes.INTEGER(10).UNSIGNED,
      allowNull: false,
      unique: true,
      references: {
        model: 'shop',
        key: 'id'
      }
    },
    email: {
      type: DataTypes.STRING(255),
      allowNull: false
    }, 
    others: {
      type: DataTypes.STRING(255),
      allowNull: false
    },{
    timestamps: false,
    createdAt: false,
    updatedAt: false,
    tableName: 'customers'
  }

1 个答案:

答案 0 :(得分:0)

根据我的观点,bulkCreate将仅对id执行操作(不应考虑唯一约束)。

因此,如果您尝试使用bulkCreate插入重复值(在具有唯一值约束的列中),那么它将抛出错误并且不会插入任何记录。因此,在这种情况下,您必须手动进行检查。

所以我建议首先检查唯一值,然后再使用bulkCreate。

或者

遍历记录并为每条记录调用android.database.sqlite.SQLiteException: near "(": syntax error (code 1): , while compiling: CREATE VIRTUAL TABLE CommerceName ( _id TEXT PRIMARY KEY,id INTEGER,name TEXT,category TEXT,imageref TEXT ) 方法,并将唯一值列放在条件类似的位置。这将比bulkCreate花费更多时间,但更具体。

 public static final String SQL_CREATE_ENTRIES =
            "CREATE VIRTUAL TABLE " + CommerceSearchReaderDbHelper.CommerceNameSearchEntry.TABLE_NAME + " ( " +
                    CommerceSearchReaderDbHelper.CommerceNameSearchEntry._ID            + TEXT_TYPE +"  PRIMARY KEY," +
                    CommerceSearchReaderDbHelper.CommerceNameSearchEntry.COLUMN_ID      + INTEGER_TYPE + COMMA_SEP +
                    CommerceSearchReaderDbHelper.CommerceNameSearchEntry.COLUMN_NAME    + TEXT_TYPE + COMMA_SEP  +
                    CommerceSearchReaderDbHelper.CommerceNameSearchEntry.COLUMN_CATEGORY+ TEXT_TYPE + COMMA_SEP  +
                    CommerceSearchReaderDbHelper.CommerceNameSearchEntry.COLUMN_IMAGEREF + TEXT_TYPE +
                    " )";

    public static final String SQL_DELETE_ENTRIES =
            "DROP TABLE IF EXISTS " + CommerceSearchReaderDbHelper.CommerceNameSearchEntry.TABLE_NAME;

    public static abstract class CommerceNameSearchEntry implements BaseColumns {
        public static final String TABLE_NAME       = "CommerceName";
        public static final String COLUMN_ID        = SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA;
        public static final String COLUMN_NAME      = SearchManager.SUGGEST_COLUMN_TEXT_1;
        public static final String COLUMN_CATEGORY  = SearchManager.SUGGEST_COLUMN_TEXT_2;
        public static final String COLUMN_IMAGEREF  = SearchManager.SUGGEST_COLUMN_ICON_1;
    }