Anish
Anish

Reputation: 785

Composite primary key in Sequelize

Can someone suggest how do I set primary key on two columns within the same table.

var relation = {
        'user_id': {
            type: DataTypes.INTEGER
        },
        'organization_id':{
            type: DataTypes.INTEGER
        }
}

I want to define a primary key like primary key (user_id, organization_id)

Note: Using PostgreSQL

Upvotes: 24

Views: 32338

Answers (1)

Lin Du
Lin Du

Reputation: 102257

You can create composite primary keys in Sequelize by specifying primaryKey: true against more than one column. E.g.

import { sequelize } from '../../db';
import { Model, DataTypes } from 'sequelize';

class Tbl extends Model {}
Tbl.init(
  {
    user_id: {
      type: DataTypes.INTEGER,
      primaryKey: true,
    },
    organization_id: {
      type: DataTypes.INTEGER,
      primaryKey: true,
    },
  },
  { sequelize, modelName: 'tbls' },
);

(async function test() {
  try {
    await sequelize.sync({ force: true });
  } catch (error) {
    console.log(error);
  } finally {
    await sequelize.close();
  }
})();

The execution result and generated SQL:

Executing (default): CREATE TABLE IF NOT EXISTS "tbls" ("user_id" INTEGER , "organization_id" INTEGER , PRIMARY KEY ("user_id","organization_id"))

Check the table definition:

=# \d+ tbls;
                             Table "public.tbls"
     Column      |  Type   | Modifiers | Storage | Stats target | Description
-----------------+---------+-----------+---------+--------------+-------------
 user_id         | integer | not null  | plain   |              |
 organization_id | integer | not null  | plain   |              |
Indexes:
    "tbls_pkey" PRIMARY KEY, btree (user_id, organization_id)

Upvotes: 33

Related Questions