2016-04-27 79 views
7

可以將兩個外鍵定義爲模型的複合主鍵嗎?將外鍵作爲複合主鍵使用

用戶只能是一個家庭的成員,一個家庭可以有許多成員和家庭成員表所需要的用戶和家庭

const User = sequelize.define(
    'User', 
    { 
     id: { type: dataTypes.INTEGER.UNSIGNED, autoIncrement: true, primaryKey: true }, 
     name: { type: dataTypes.STRING(30) }, 
     email: { type: dataTypes.STRING(30) } 
     ... 
    }, 
    { 
     classMethods: { 
      associate(models) { 
       User.hasOne(models.FamilyMember, { 
        foreignKey: 'user_id' 
       } 
      } 
     } 
    } 
) 

const Family = sequelize.define(
    'Family', 
    { 
     name: { type: dataTypes.STRING(30) } 
    }, 
    { 
     classMethods: { 
      associate(models) { 
       Family.hasMany(models.FamilyMember, { 
        foreignKey: 'family_id' 
       } 
      } 
     } 
    } 
) 

const FamilyMember = sequelize.define(
    'FamilyMember', 
    { 
     name: { type: dataTypes.STRING(30) }, 
     /* 
     family_id and user_id will be here after associations but I wanted them to be a composite primaryKey 
     */ 
    } 
) 
+1

我不確定您是否可以製作複合主鍵,但我知道您可以製作複合唯一鍵。我不確定他們是否能夠幫助您解決您的問題。 –

回答

7

事實上的參考,我幾乎得到了解決從文檔:

User = sequelize.define('user', {}); 
Project = sequelize.define('project', {}); 
UserProjects = sequelize.define('userProjects', { 
    status: DataTypes.STRING 
}); 

User.belongsToMany(Project, { through: UserProjects }); 
Project.belongsToMany(User, { through: UserProjects }); 

缺省情況下上面的代碼將添加專案編號和用戶id到UserProjects表,並刪除任何以前定義的主鍵屬性 - 該表將由COM被唯一標識這兩個表格的鍵的組合,並且沒有理由具有其他PK列。

Source

+2

但是如何在使用sequelize-cli的遷移中做到這一點? –

+1

在遷移定義你的表結構後,例如你可以添加這個對象: 'uniqueKeys:[{ 名: 「UniqueUserPermissions」, singleField:假的, 字段: 「PermissionId」, 「用戶ID」], }]' – YassinMK

0

對於任何人都希望創建做遷移時,在你的連接表基於列(鍵)的綜合指數的主鍵。您需要爲希望充當表的組合主鍵的兩列添加主鍵約束。

module.exports = { 
    up: function (queryInterface, Sequelize) { 
    return queryInterface.createTable('itemtags', { 
     itemId: { 
     type: Sequelize.INTEGER, 
     references: { 
      model: 'items', 
      key: 'id', 
     }, 
     onDelete: 'CASCADE', 
     onUpdate: 'CASCADE', 
     allowNull: false 
     }, 
     tagId: { 
     type: Sequelize.INTEGER, 
     references: { 
      model: 'tags', 
      key: 'id', 
     }, 
     onDelete: 'CASCADE', 
     onUpdate: 'CASCADE', 
     allowNull: false 
     } 
    }) 
     .then(() => { 
     return queryInterface.addConstraint('itemtags', ['itemId', 'tagId'], { 
      type: 'primary key', 
      name: 'gametag_pkey' 
     }); 
     }); 
    }, 
    down: function (queryInterface, Sequelize) { 
    return queryInterface.dropTable('gametags'); 
    } 
}; 

這與postgres中的ALTER TABLE ONLY my_table ADD CONSTRAINT pk_my_table PRIMARY KEY(column1,column2);大致相同。