顺序迁移:向同一表的列添加外键约束

时间:2019-02-26 22:22:55

标签: node.js foreign-keys sequelize.js database-migration

所以我试图在迁移文件中创建一个具有外键约束的表。

我尝试着遵循sequelize docs,下面是我尝试过的代码,并且我还尝试了将外键引用移到定义属性的位置,但是它不起作用还有。有什么方法可以做我想在这里做的事吗?

module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('comments', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      root_id: {
        defaultValue: null,
        type: Sequelize.INTEGER
      },
      parent_id: {
        defaultValue: null,
        type: Sequelize.INTEGER
      },
    }).then(() => queryInterface.addConstraint(
      'comments',
      ['root_id'],
      {
        type: 'foreign key',
        name: 'root_id_fk',
        references: {
          table: 'comments',
          field: 'root_id'
        },
        onDelete: 'cascade',
        onUpdate: 'cascade'
      }
    )).then(() => queryInterface.addConstraint(
      'comments',
      ['parent_id'],
      {
        type: 'foreign key',
        name: 'parent_id_fk',
        references: {
          table: 'comments',
          field: 'parent_id'
        },
        onDelete: 'cascade',
        onUpdate: 'cascade'
      }
    ))
  },

4 个答案:

答案 0 :(得分:3)

Shashikant Pandit 的回答很好,但它不兼容跨数据库。

我在使用该迁移时遇到了问题,因为我有一个 PostgreSQL 作为主数据库,还有一个内存中的 SQLite 数据库用于我的测试。在测试环境中运行迁移(测试以空白 DB 开始并运行迁移以获取最新信息)在 SQLite 中产生错误。

这是一个使用 Sequelizes addConstraint 内置的版本,应该是跨数据库兼容的。

module.exports = {
  up: (queryInterface, Sequelize) => queryInterface
    .addConstraint('app_users', {
      type: 'UNIQUE',
      fields: ['email', 'column2', 'column3'],
      name: 'unique_user_email',
    }),
  down: (queryInterface, Sequelize) => queryInterface
    .removeConstraint('app_users', 'unique_user_email'),
};

答案 1 :(得分:0)

我弄清楚我做错了什么,我试图创建一个外键来引用同一列上的自身,而当时我应该引用另一列。哇!

答案 2 :(得分:0)

module.exports = {
  up: function(queryInterface, Sequelize) {
    return queryInterface.sequelize.query("ALTER TABLE app_users ADD CONSTRAINT unique_user_email UNIQUE (email,column2,column3);")
  },
  down: function(queryInterface, Sequelize) {
    return queryInterface.sequelize.query("ALTER TABLE app_users DROP INDEX unique_user_email;")
  }
};

答案 3 :(得分:0)

对于寻求有关如何添加外键的答案的任何人,请使用此Sequelize Constraints