λ€μ MySQL λ€νλ₯Ό κΈ°λ°μΌλ‘ ν μ΄λΈμ λ§λ€κ³ μΆμ΅λλ€.
CREATE TABLE `my_table` (
`cmdId` int(10) unsigned NOT NULL AUTO_INCREMENT,
`deviceId` char(16) NOT NULL,
`fnNumber` int(10) unsigned DEFAULT NULL,
`chNumber` int(10) unsigned DEFAULT NULL,
`cmd` varchar(50) DEFAULT NULL,
`cmdDate` datetime DEFAULT NULL,
`delivered` tinyint(1) DEFAULT NULL,
PRIMARY KEY (`cmdId`,`deviceId`),
KEY `deviceId` (`deviceId`),
CONSTRAINT `tblcommands_ibfk_1` FOREIGN KEY (`deviceId`) REFERENCES `second_table` (`deviceId`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
λ΄ knexλ λ€μκ³Ό κ°μ΅λλ€.
knex.schema.createTable('my_table', function(t) {
t.primary(['cmdId', 'deviceId']);
t.increments('cmdId');
t.string('deviceId', 16).notNullable().references('second_table.deviceId');
t.integer('fnNumber').unsigned();
t.integer('chNumber').unsigned();
t.string('cmd96', 50);
t.dateTime('cmdDate');
t.boolean('delivered');
});
κ·Έλ¬λ κΈ°λ³Έ ν€μ λ¬Έμ κ° μμ΅λλ€. λ€μκ³Ό κ°μ μ€λ₯κ° λ°μν©λλ€.
Error: Multiple primary key defined
increments
λ©μλλ μ΄λ―Έ PKλ₯Ό μμ±νκ³ primary
λ©μλλ μ€λ₯λ₯Ό μΌμΌν€λ λ€λ₯Έ νλλ₯Ό μμ±νλ€κ³ κ°μ ν©λλ€.
μ΄ νμμ ν μ΄λΈμ μ»μ μ μμ΅λκΉ?
μλμ,νμ§λ§ κ·ΈλμΌν©λλ€. μ΄κ²μ λν΄ μ‘°μ¬ν΄ λ³΄κ² μ΅λλ€.
https://github.com/tgriesser/knex/blob/master/lib/dialects/mysql/schema/column.js#L30 μ λ°λ₯΄λ©΄
ColumnCompiler_MySQL.prototype.increments = 'int unsigned not null auto_increment primary key';
λ°λΌμ .increments()
PKλ₯Ό μμ±ν©λλ€. λ무 κ°ν νλ μλκ°μ? PKμμ΄ AUTO_INCREMENT
μ΄μ μμ±νλ κ²μ΄ λ μ’μ κ²μ΄λΌκ³ μκ°ν©λλ€.
int unsigned not null auto_increment
PKλ₯Ό μμ±νλ €λ©΄ .primary()
λ₯Ό νΈμΆν΄μΌν©λλ€.
table.increments('id').primary();
AUTO_INCREMENT
μ΄λ‘ λ§μ PKλ₯Ό λ§λ€ μ μμ΅λλ€.
μμ μ©μΌλ‘ μ§κΈ μ¬μ©ν©λλ€.
table.primary(['cmdId', 'deviceId']);
table.integer('cmdId').notNullable();
table.string('deviceId', 16).notNullable().references('second_table.deviceId');
κ·Έλ¦¬κ³ then
μ½λ°±μμ :
knex.schema.raw('ALTER TABLE my_table MODIFY cmdId INT UNSIGNED AUTO_INCREMENT');
λΉμ·ν λ¬Έμ κ° μμ΅λλ€. .increments()
μ (λ₯Ό) κΈ°λ³Έ ν€μμ΄ μ¬μ©νκ³ μΆμ΅λλ€. μ κ²½μ°μλ μ±λ₯μμ μ΄μ μ
λλ€. μΈλ±μ€κ°μλ ν
μ΄λΈ (κΈ°λ³Έ ν€κ° μμ)μ λ§λ€κ³ λ§μ νμ μ½μ
ν λ€μ μλ μ¦κ° μ΄μ μΈλ±μ€λ₯Ό μΆκ°νκ³ μΆμ΅λλ€. μ΄κ²μ μ±λ₯μ΄ λ λ°μ΄λλ©° μ€μ λ‘ Postgres λ¬Έμ (http://www.postgresql.org/docs/9.4/static/populate.html#POPULATE-RM-INDEXES μ°Έμ‘°)μμ κΆμ₯νμ§λ§ νμ¬λ λΆκ°λ₯ν κ² κ°μ΅λλ€. knex.
λλ λν λΉμ·ν λ¬Έμ κ° λ°μνλ κ² κ°μ΅λλ€. λ€μκ³Ό κ°μ ν μ΄λΈμ λ§λ€ μ μμ΅λλ€.
knex.schema.createTable("numeric_table", function (table) {
table.integer("integer_key").primary;
// Both increments & bigIncrements tries to create primary key.
table.increments("increment_key");
table.bigIncrements("big_increment_key");
});
μ¬κΈ°μ κ°μ λ¬Έμ .increments ()λ μλμΌλ‘ μ§μ νλλΌλ κΈ°λ³Έ ν€λ₯Ό μ μνλ €κ³ ν©λλ€.
μμ 쿼리λ₯Ό μ¬μ©νμ¬ κΈ°λ³Έ ν€μμ΄ μ¦λΆ μ΄μ μΆκ° ν μ μμ΅λλ€.
exports.up = function (knex) {
return Promise.all([
knex.raw('alter table "my_table" add column "my_seq" bigserial'),
]);
};
exports.down = (knex) => {
return Promise.all([
knex.schema.table('my_table', (t) => {
t.dropColumn('my_seq');
}),
]);
};
λλ λ€μμ μ¬μ©νμ¬ μλ μ¦κ° μ΄μ λ§λ€ μ μμ΅λλ€.
table.specificType('myid','serial');
(Postgresqlμλ§ ν΄λΉ)
νμ§λ§ table.increments()
λ table.increments().primary()
μλμΌλ‘ μ§μ νλ κ²½μ°μλ§ PKλ₯Ό μμ±ν©λλ€.
λ λμ§ μλ μ΄μ
increments: 'serial'
λμ μ
increments: 'serial primary key'
κ·Έκ² λ¬΄μ¨ λ¬Έμ μ λκΉ?
μ¬μ ν κ°μ μ€λ₯κ° λ°μν©λλ€.
IMHO .increments
μ (λ) PKλ₯Ό μμ±νμ§ μμμΌν©λλ€.
μ΄ λ¬Έμ μ λν μμμ΄ μμ΅λκΉ?
λμ ν¨-λ€μν λ°©λ²μΌλ‘μ΄ λ¬Έμ λ₯Ό ν΄κ²°ν μλ μμ§λ§ APIκ° κΈ°λ³Έ ν€λ‘ λ§λ€μ§ μκ³ μλ μ¦κ° μ΄μ μμ±νλ μΌκΈ μ§μμ΄ μλ€λ κ²μ λ€μ μ΄μν©λλ€.
κ·Έλ λ€κ³ ν΄μμ΄ λ¬Έμ κ° μμ§ ν΄κ²°λμ§ μμλ€κ³ μκ°ν©λλ€. κ°μ₯ νλͺ ν λ°©μμΌλ‘μ΄ λ¬Έμ λ₯Ό μμ νλ κ²μ λΈλ μ΄νΉ 체μΈμ§μ΄λ―λ‘ λ©μ΄μ λ²μ λ²νμ μΌλΆ μ¬μΌνκΈ° λλ¬Έμ λλ€.
λΏ‘λΏ‘
λ¬Έμ λ ν
μ΄λΈμ μμ± ν λ μ΄μ .primary()
λ₯Ό μ¬μ©νλ©΄ ν
μ΄λΈ μμ±μμν λ³λμ 쿼리μ κΈ°λ³Έ ν€λ₯Ό μ μνλ λ λ€λ₯Έ alter table
쿼리κ°λ©λλ€.
MySQL (λλ μλ§λ λ€λ₯Έ DBMS)μμλ PK μμ΄λ auto_incremement
νλλ₯Ό κ°μ§ μ μλ€κ³ μκ°ν©λλ€.
λ°λΌμ knexλ κΈ°λ³Έ ν€λ‘ ν
μ΄λΈμ μμ± ν λ€μ ν
μ΄λΈμ μ΄λ―Έ νλκ° μμΌλ―λ‘ λ κ°μ κΈ°λ³Έ ν€λ₯Ό μ μνκΈ° μν΄ alter
λ§ ν μ μμ΅λλ€.
μ΄ λ¬Έμ λ₯Ό ν΄κ²°ν μ μλ€λ©΄ .increments
μ¬μ ν PKλ₯Ό μμ±νμ§λ§ νλμ create table
쿼리μμ λ€λ₯Έ μ΄λ λͺ¨λ PKκ°λλλ‘ νμ©νλ―λ‘ μ£Ό λ²μ λ²νκ° νμνμ§ μμ κ²μ
λλ€.
λλμ΄λ₯Ό μν΄ λ€λ₯Έ μ΄ μ νμ μΆκ°νκ³ μ΄μ λ²μ κ³Όμ νΈνμ±μ κΉ¨μ§ μλλ‘ .increments
μ κ·Έλλ‘ λ μ μμ΅λλ€.
@ amir-s : knexκ° μλνλ μ΄μ λ₯Ό μ μ€λͺ ν©λλ€. μ§μλλ λ€λ₯Έ DBMSμμ λμΌν μλμ μλνλ κ² κ°μ΅λλ€. λλ νΉλ³ν μ’μνμ§ μμ§λ§ μ μ΄λ μ§κΈμ μ΄μνκ² λ³΄μ΄μ§ μμ΅λλ€.
μ μμ λ¬Έμ λ μ μμ λ°λΌ ν μ΄λΈμ μ¬λ¬ κΈ°λ³Έ ν€λ₯Ό κ°μ§ μ μλ€λ κ²μ λλ€. (μ¬λ¬ μ΄μ 1 κ°μ λ³΅ν© PKλ₯Ό κ°μ§ μ μμ§λ§ 2 κ°μ λ¨μΌ μ΄ PKλ₯Ό κ°λ κ²κ³Όλ λ§€μ° λ€λ¦ λλ€.)
λ°λΌμ .increments
κ° PKλ₯Ό μμ±νλ©΄ λ€λ₯Έ μ΄λ PKλ‘ νμλλλ‘ νμ© ν μ μμ΅λλ€. .increments
μ μ λ¬ν μμλ μ΅μ
μ μμ±νμ¬ Postgres λ° μ΄λ¬ν λμμ μ§μνλ λ€λ₯Έ DBMSμμ κΈ°λ³Έ ν€ λμμ λΉνμ±ν ν μ μμ΅λλ€. μλ§λ μ΄μ λ²μ κ³Όμ νΈνμ±μ κΉ¨μ§ μκ³ DBMS κ° νΈνμ±μ κΉ¨μ§ μκΈ° λλ¬Έμ μ΄κ²μ΄ μ΅μμ μ루μ
μΌ κ²μ
λλ€. λλ μ¬μ ν Postgresμ κΈ°λ³Έ λμμ λ³κ²½νλ κ²λΏλ§ μλλΌ .increments
λ PKλ‘ λ§λ€μ§ μμ§λ§ λ μ½κ² λ°μ λ€μ¬μ§λ PRμ΄ λ μ μλλ‘ κ·Έκ²μ μ’μνμ§ μμ΅λλ€.
λκ΅°κ°κ° κ·Έ λΌμΈμ λ°λΌ PRμ μ μΆνκ³ μΆλ€λ©΄ λλ κ·Έμκ² μ 리νλ€κ³ μ£Όμ₯ν©λλ€. :-)
@zacronos μ£μ‘ν©λλ€. "μ¬λ¬ PK"λ "μ¬λ¬ μ΄μ νλμ PK"λ₯Ό μλ―Ένμ΅λλ€.
μμ λͺ¨λ μ견μ λμν©λλ€. μ΄ λμμ ν€κ° μλ μλ μ¦κ° μ΄λΏλ§ μλλΌ λ³΅ν© κΈ°λ³Έ ν€λ₯Ό λ§λ€λ €κ³ ν λ μκΈ°μΉ μμ λμμ λλ€. μ΄κ²μ΄ ꡬνλλ κ²μ 보λ κ²μ΄ μ’μ κ²μ λλ€.
μ΄ λ¬Έμ λ λ°μνκ³ μμ§λ§ Postgres
μ μ¬μ©νκ³ μ§λ ¬ νλλ₯Ό μΈλ ν€λ‘ μ¬μ©νλ κ²½μ°- Postgres
μ§λ ¬ νλμ knex ꡬνμ increments()
κ·Έλ¬λ©΄ κΈ°λ³Έμ μΌλ‘ κΈ°λ³Έ ν€κ°λ©λλ€. λλ postgresλΏλ§ μλλΌ sqlite3λ₯Ό λΉλ ν μ μκΈ°λ₯Ό μνλ―λ‘ μμ knex 쿼리λ₯Ό μ¬μ©νλ©΄ λλ λ μ€ νλλ‘ μ νλ©λλ€. ν΄κ²° λ°©λ² μ μμ΄ μμ΅λκΉ?
μ΄ μ€λ λλ νλμ λ§μ κ΄μ¬μλ°μ§ λͺ»νμ΅λλ€. μ΄μ λ²μ κ³Ό νΈνλλ μ΄μμ μΈ μ루μ
μ΄λΌκ³ μκ°νλ κ²μ λ°λ³΅νκ³ μΆμ΅λλ€ (λ°λΌμ λͺ¨λ λ§μ΄λ 릴리μ€μ μΌλΆκ° λ μ μμ) : .increments()
μ μ΅μ
μ μΆκ°νκ±°λ primaryKey: false
μ μΆκ°ν©λλ€. (κ°λ₯ν DBMSμ κ²½μ°) κΈ°λ₯μ κΈ°λ³Έ ν€ λΆλΆμ λΉνμ±νν©λλ€.
.increments()
λ κΈ°λ³Έ λμμ μ μ§νλ―λ‘ μμ ν μ νΈνλ©λλ€.
@zacronos μ½λλ₯Ό λΉ λ₯΄κ² μ΄ν΄ 보μμ΅λλ€. μ¬μ ν΄ λ³΄μ
λλ€. PRμ ν¨κ» λμ§κ±°μΌ
https://github.com/DeedMob/knex/tree/master/src
μ¬κΈ°μλ κ°μ λ¬Έμ κ° μμ΅λλ€. bigIncrements()
κ° λ€λ₯Έ κΈ°λ³Έ ν€λ₯Ό λ§λ€μ§ μλλ‘ μμ 쿼리λ₯Ό μ¬μ©ν΄μΌν©λλ€.
ν΄κ²° λ°©λ² :
table.bigincrements();
table.biginteger('other').notNullable();
table.dropPrimary();
table.primary(['id', 'other']);
μ΄ μ£Όμ μ λν μ΄μ μ‘°μ¬λ₯Ό μ¬λ°λ₯΄κ² μ΄ν΄νλ©΄ μΌλΆ DB (μ : MySQL)κ° κΈ°λ³Έ ν€κ° μλ μΌλ ¨ λ²νΈλ₯Ό λ§λ€ μ μκΈ° λλ¬Έμ knexκ° κΈ°λ³Έ ν€λ₯Ό μ격νκ² κ°μ μ μ©ν©λκΉ? κ·Έλ λ€λ©΄ Postgresμ κ΄λ ¨νμ¬ μ΄μ λ²μ κ³Όμ νΈνμ±μ λν΄ λ무 κ±±μ νμ§ μμ κ²μ λλ€.
κ·Έλ¬λ©΄ MySQL μ¬μ©μλ μ΄κ²μ΄ κΈ°λ³Έμ΄ λ κ²μΌλ‘ μμν©λλ€.
Postgres μ¬μ©μλ κ·Έλ μ§ μμ΅λλ€. _ (μμμ λΆλͺ
ν μ¬μ€) _
μ΄λ° μ΄μ λ‘ Postgresμμ κΈ°λ³Έ ν€λ₯Ό _not_ κ°μ λ‘ μ‘°μ νκ³ λ³κ²½ λ‘κ·Έμ μΆκ°νλ κ²μ΄ λ§€μ° μμ νλ€κ³ μκ°ν©λλ€. ν¨μΉκ° μλλΌ λ€μ λ©μ΄μ λ²μ μ λλ€.
μ΄λ° μ΄μ λ‘ Postgresμμ κΈ°λ³Έ ν€λ₯Ό κ°μ νμ§ μλλ‘ μ‘°μ νκ³ λ³κ²½ λ‘κ·Έμ μΆκ°νλ κ²μ΄ λ§€μ° μμ νλ€κ³ μκ°ν©λλ€. ν¨μΉκ° μλλΌ λ€μ λ©μ΄μ λ²μ μ λλ€.
λλ νμ κ·Έλ κ² μλ ν΄ μκΈ° λλ¬Έμ postgresqlμ λν΄μλ .primary()
μμ΄ table.bigincrements('id')
λ§ μμ±νμ¬ νμ λ§μ΄κ·Έλ μ΄μ
μ μμ±ν΄ μ¨ μμ λͺ
μ μ¬λλ€μ μκ³ μμ΅λλ€.
κΈ°λ³Έ ν€λ₯Ό λ§λ€μ§ λ§μμΌνλ μΆκ° μ΅μ μ΄ μμ§λ§ κ±°κΈ°μμλ κ²μ²λΌ 보μ λλ€. μ μ΄λ λλ κΈ°λ³Έ ν€ μμ± κ±΄λ λ°κΈ°μ λν postgres / mysql ꡬνμ λν΄ μ무κ²λ μ°Ύμ§ λͺ»νμ΅λλ€.
μ΄κ²μ λ§μ΄κ·Έλ μ΄μ μ λν μ£Όμ νμ νΈνμ±μ κΉ¨λ λ³κ²½ μ¬νμ΄ λ κ²μ λλ€. μ΄ μ΄μ λ§μ΄κ·Έλ μ΄μ APIλ₯Ό κ³μ ν¨μΉνλ €λ©΄ λ¨Όμ λͺ¨λ μ¬λμ΄ λͺ¨λ knex λ²μ μμ μ΄μ λ§μ΄κ·Έλ μ΄μ μ μμ νμ§ λͺ»νλλ‘ λ²μ κ΄λ¦¬ μ§μμ μΆκ°ν΄μΌν©λλ€ (λ§μ΄κ·Έλ μ΄μ μ½λμ λ³κ²½ μ¬νμ μ νν λμΌνκ² μλνλμ§ νμΈνκΈ°κ° λ§€μ° μ΄λ ΅μ΅λλ€. μλ ν μ€νΈμ΄λ―λ‘ knexμ μ¬μ©μ μ½λμμ λ§€μ° μ·¨μ½ν λΆλΆμ λλ€).
μ΄λ€ ν΄κ²°μ± μ΄ μμ΅λκΉ?
μ΄κ²μ λν μμμ΄ μμ΅λκΉ?
μ΄ μ€λ λλ νλμ λ§μ κ΄μ¬μλ°μ§ λͺ»νμ΅λλ€. μ΄μ λ²μ κ³Ό νΈνλλ μ΄μμ μΈ μ루μ μ΄λΌκ³ μκ°νλ κ²μ λ°λ³΅νκ³ μΆμ΅λλ€ (λ°λΌμ λͺ¨λ λ§μ΄λ 릴리μ€μ μΌλΆκ° λ μ μμ) :
.increments()
μ μ΅μ μ μΆκ°νκ±°λprimaryKey: false
μ μΆκ°ν©λλ€. (κ°λ₯ν DBMSμ κ²½μ°) κΈ°λ₯μ κΈ°λ³Έ ν€ λΆλΆμ λΉνμ±νν©λλ€.
.increments()
λ κΈ°λ³Έ λμμ μ μ§νλ―λ‘ μμ ν μ νΈνλ©λλ€.
μ΄μ κ°μ μ¦λΆμ μ¬μ©ν μ μμ΅λκΉ? λͺ¨λ μ λ°μ΄νΈ?
μ΄λ»κ² λκ±° μΌ? νΉν MSSQLμμ PK μ μ½μ κΈ°λ³Έμ μΌλ‘ μ΄λ¦μ΄ μ§μ λμ§ μμ§λ§ "PK__requests__DD771E3CC0CD0A5E"μ κ°μ΄ μ λ§ κ³ ν΅ μ€λ½μ΅λλ€. κ·Έλμ λλ κ·Έκ²μ λ¨μ΄ λ¨λ¦¬κ³ λ€λ₯Έ PKλ₯Ό λ§λ€ μλ μμ΅λλ€.
μ μ½ μ΄λ¦μ μ§μ νμ§λ§ increments ()μ λν΄ μλνμ§ μμ΅λλ€.
μμ§ μ무κ²λ μλμ?
.incrementsμ μ νμ λ§€κ° λ³μλ λ§€μ° μ’μν κ²μ λλ€! μμ 쿼리λ λΆλͺ ν μλ ν μ μμ§λ§ μ¬λ¬ κ°μ μλ‘ λ€λ₯Έ DBλ₯Ό μ€ννλ μ¬μ©μμκ²λ μ±κ°μ μΌμ λλ€ (μ : νλ‘λμ μμν mariadb, ν μ€νΈλ₯Όμν sqlite). μ΄κ²μ λν μ λ°μ΄νΈκ° μμ΅λκΉ? μ΄λ―Έ μ μ λ
λ λ²μ§Έλ‘ μ λ μ΄λ―Έ λ¨μΌ νλ‘μ νΈμμ 3 λ²μ΄ νμνμ΅λλ€.
μ¬κΈ°μλ λμΌν λ¬Έμ λ‘ PK μ΄μμλ₯Ό λΉνμ±ννλ μΆκ° λ§€κ° λ³μκ° ν©λ¦¬μ μ λλ€.
# 2896κ³Ό μ μ¬νκ² MySQLμ μ¬μ©ν μ μμ΅λλ€.
t.primary(["cmdId", "deviceId"]);
t.specificType("cmdId", "int(10) unsigned AUTO_INCREMENT").notNullable();
t.string("deviceId", 16).notNullable().references("second_table.deviceId");
κ°μ₯ μ μ©ν λκΈ
λλ λ€μμ μ¬μ©νμ¬ μλ μ¦κ° μ΄μ λ§λ€ μ μμ΅λλ€.
(Postgresqlμλ§ ν΄λΉ)
νμ§λ§
table.increments()
λtable.increments().primary()
μλμΌλ‘ μ§μ νλ κ²½μ°μλ§ PKλ₯Ό μμ±ν©λλ€.