Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

like image 820
Anish Avatar asked Dec 03 '19 18:12

Anish


1 Answers

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)
like image 185
slideshowp2 Avatar answered Oct 17 '22 10:10

slideshowp2