JetBrains / Exposed

Kotlin SQL Framework
http://jetbrains.github.io/Exposed/
Apache License 2.0
8.36k stars 695 forks source link

Set autoincrement and unique index fails #1314

Open JimeFuture opened 3 years ago

JimeFuture commented 3 years ago

Maybe i'm wrong but setting a column like: long("ordernumber").uniqueIndex().autoIncrement()

should be fine in case of Mysql. In newer versions its allowed to have a autoincrement column without the constraint of haveing it to be the primary key.

I got the following error:

org.jetbrains.exposed.exceptions.ExposedSQLException: java.sql.SQLSyntaxErrorException: Incorrect table definition; there can be only one auto column and it must be defined as a key
SQL: [CREATE TABLE IF NOT EXISTS good (id BINARY(16) PRIMARY KEY, active BOOLEAN NOT NULL, code VARCHAR(20) NOT NULL, description VARCHAR(255) NOT NULL, externalcode VARCHAR(30) NOT NULL, ordernumber BIGINT AUTO_INCREMENT NOT NULL)]

I not even see the unique Index there....

Using exposed : 0.32.1 with jdbc for mysql

tajobe commented 2 years ago

This seems to be because SchemaUtils#create deliberately separates the index creation from the table create.

bog-walk commented 4 months ago

To add a unique column definition directly in CREATE TABLE, Column.withDefinition() will become available in upcoming version 0.52.0:

val orderNumber = long("ordernumber").withDefinition("UNIQUE").autoIncrement()

This will not add an index instance to Table.indices, however. This means that using, for example, SchemaUtils.createMissingTablesAndColumns() will work except a message will be logged (due to database having column index that is not found in Exposed table object).