Ошибка секвелирования: отсутствует индекс для ограничения

20181005120552 создать-заказ-detail.js

'use strict';
module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('OrderDetails', {
      orderDetailId: {
        type: Sequelize.INTEGER,
        primaryKey: true,
        allowNull: false,
        autoIncrement: true,
      },
      orderId: {
        type: Sequelize.INTEGER,
        onDelete: 'CASCADE',
        references: {
          model: 'Orders',
          key: 'orderId'
        }
      },
      productName: {
        type: Sequelize.STRING,
        primaryKey: true,
        allowNull: false,
      },
      count: {
        type: Sequelize.INTEGER
      },
      orderDetailPrice: {
        type: Sequelize.INTEGER,
        onDelete: 'CASCADE',
        references: {
          model: 'Orders',
          key: 'totalPrice'
        }
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE
      }
    });
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('OrderDetails');
  }
};

20181005120522 создать заказ

'use strict';
module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface
    .createTable('Orders', {
      orderId: {
        type: Sequelize.INTEGER,
        primaryKey: true,
        autoIncrement: true,
        allowNull: false
      },
      userId: {
        type: Sequelize.STRING,
        onDelete: 'CASCADE',
        references: {
          model: 'Users',
          key: 'userId'
        }
      },
      orderDate: {
        type: Sequelize.DATE
      },
      totalPrice: {
        type: Sequelize.INTEGER,
        primaryKey: true,
        allowNull: false,
      },
      orderState: {
        type: Sequelize.STRING
      },
      shippingNumber: {
        type: Sequelize.STRING
      },
      basicAddress: {
        type: Sequelize.STRING
      },
      detailAddress: {
        type: Sequelize.STRING
      },
      telNumber: {
        type: Sequelize.INTEGER
      },
      phoneNumber: {
        type: Sequelize.INTEGER
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE
      }
    });
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('Orders');
  }
};

Когда я выполнил сценарий sequelize db:migrateпредыдущая миграция выполнена без ошибок. на этом уровне он возвращает ошибку. Я не знаю, как я могу решить эту проблему, я думаю, что-то не так.

ОШИБКА: не удалось добавить ограничение внешнего ключа. Отсутствует индекс для ограничения 'orderdetails_ibfk_2' в ссылочной таблице 'orders'

Это сообщение об ошибке. Я хочу подключить файлы OrderDetails.orderDetailPrice а также Orders.totalPrice,

Благодарю.

2 ответа

Как здесь сообщается, похоже, что у Sequelize есть некоторые проблемы со ссылками на составные ключи.

Однако, используя выполнение запроса Sequelize, вы можете обойти вашу проблему. В вашем случае вы можете выполнить следующий запрос MySQL:

ALTER TABLE `db_test`.`OrderDetails` ADD CONSTRAINT `fk_order_detailes_orders` 
FOREIGN KEY (`orderId` , `orderDetailId`) 
REFERENCES `db_test `.`orders`(`orderId` , `totalPrice`);

Таким образом, ваш файл переноса create-order-detail становится следующим:

    'use strict';
    module.exports = {
        up: (queryInterface, Sequelize) => {
            return queryInterface.createTable('OrderDetails', {
                orderDetailId: {
                    type: Sequelize.INTEGER.UNSIGNED,
                    primaryKey: true,
                    allowNull: false,
                    autoIncrement: true,
                },
                orderId: {
                    type: Sequelize.INTEGER,
                    allowNull: false,
                },
                productName: {
                    type: Sequelize.STRING,
                    primaryKey: true,
                    allowNull: false,
                },
                count: {
                    type: Sequelize.INTEGER,
                },
                orderDetailPrice: {
                    type: Sequelize.INTEGER,
                    allowNull: false,
                },
                createdAt: {
                    allowNull: false,
                    type: Sequelize.DATE,
                },
                updatedAt: {
                    allowNull: false,
                    type: Sequelize.DATE,
                },
            })
                .then(() => {
                    return queryInterface.sequelize.query('ALTER TABLE `OrderDetails` ADD ' +
                        'CONSTRAINT `fk_order_details_orders` FOREIGN KEY (`orderId`, `orderDetailPrice`) REFERENCES ' +
                        'Orders(`orderId`, `totalPrice`)');
                });
        },
        down: (queryInterface, Sequelize) => {
            return queryInterface.dropTable('OrderDetails', null);
        },
    };

Джордано,

Я определил таким образом код ниже. Дайте мне знать, почему этот код может быть перенесен? первичный ключ и уникальный ключ оба ключа записаны, хотя..

создать порядок-detail.js

'use strict';
module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('OrderDetails', {
          (...),
          productName: {
            type: Sequelize.STRING,
            primaryKey: true,
            // allowNull: false
            unique: true
          },
          count: {
            type: Sequelize.INTEGER
          },
          orderDetailPrice: {
            type: Sequelize.INTEGER,
            onDelete: 'CASCADE',
            // references: {
            //     model: 'Orders',
            //     key: 'totalPrice'
            // }
          },
          createdAt: {
            allowNull: false,
            type: Sequelize.DATE
          },
          updatedAt: {
            allowNull: false,
            type: Sequelize.DATE
          }
        })
      .then(() => {
        queryInterface.addConstraint('OrderDetails', ['orderDetailPrice'], {
          type: 'foreign key',
          references: {
            name: 'orderdetails_ibfk_2',
            table: 'Orders',
            field: 'totalPrice'
          },
        })
      })
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('OrderDetails');
  }
};
Другие вопросы по тегам