gpt4 book ai didi

node.js - 如何在自引用关联中实现外键约束?

转载 作者:搜寻专家 更新时间:2023-10-31 23:55:12 27 4
gpt4 key购买 nike

假设最简单的例子:

var Person = sequelize.define('Person', {
name: Sequelize.STRING,
});

Person.hasMany(Person, { as: 'Children', foreignKeyConstraint: true });

如果我们sequelize.sync这个,我们会得到一个ChildrenPersons连接表,它有一个两列的主键,由PersonIdChildrenId,但没有外键:

CREATE TABLE `ChildrenPersons` (
`PersonId` int(11) NOT NULL DEFAULT '0',
`ChildrenId` int(11) NOT NULL DEFAULT '0',
`createdAt` datetime NOT NULL,
`updatedAt` datetime NOT NULL,
PRIMARY KEY (`PersonId`,`ChildrenId`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

如何制作 PersonIdChildrenId CONSTRAINed 外键,引用 Persons.id

我试过了 manually creating the join table , 但它没有用。

最佳答案

我对 sequelize 不是很熟悉,但我知道您可以使用它直接使用 sequelize.query 发出 SQL 查询和命令

因此,如果您只想创建具有外键约束的两个表,这里是合适的 SQL(请注意这是 SQLite 方言 - 注意缺少日期时间)

CREATE TABLE Persons(
id integer primary key,
name text);
CREATE TABLE ChildrenPersons(
personId integer not null,
childrenId integer not null,
createdAt integer not null,
updatedAt integer not null,
primary key(personId,childrenId),
foreign key(personId) references Persons(id),
foreign key(childrenId) references Persons(id));

希望对你有帮助

编辑

以下代码将使用 sequelize 术语创建表(已确认使用 sequelize 1.7.9):

var Sequelize = require('sequelize'),
sequelize = new Sequelize('test','','',
{
dialect: 'sqlite',
storage: 'test.db'
})
var Person = sequelize.define('Person', {name: Sequelize.STRING})
var PersonChildren = sequelize.define('PersonChildren',
{
PersonId: {
type: Sequelize.INTEGER,
references: Person,
referencesKey: 'id',
primaryKey: true
},
ChildrenId: {
type: Sequelize.INTEGER,
references: Person,
referencesKey: 'id',
primaryKey: true
}
})
sequelize.sync({force: true}).complete(function(err){
if(!!err){
console.log('Error: ',err)
}else
{
console.log('All OK')
}
})

引用以下关于强制外键约束的 Sequelize 文档文章: http://sequelizejs.com/docs/latest/associations

关于node.js - 如何在自引用关联中实现外键约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19686144/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com