In MYSQL mode, wrong column types are generated

Auth object:
export const auth = betterAuth({
database: drizzleAdapter(db, {
provider: "mysql",
usePlural: true,
}),
secret: env.BETTER_AUTH_SECRET,
emailAndPassword: {
enabled: true,
},
plugins: [bearer()],
trustedOrigins: [env.CLIENT],
});
export const auth = betterAuth({
database: drizzleAdapter(db, {
provider: "mysql",
usePlural: true,
}),
secret: env.BETTER_AUTH_SECRET,
emailAndPassword: {
enabled: true,
},
plugins: [bearer()],
trustedOrigins: [env.CLIENT],
});
Generated file is:
export const users = mysqlTable("users", {
id: varchar("id", { length: 36 }).primaryKey(),
...
});

export const accounts = mysqlTable("accounts", {
...
userId: text("user_id", )
.notNull()
.references(() => users.id, { onDelete: "cascade" }),
});
export const users = mysqlTable("users", {
id: varchar("id", { length: 36 }).primaryKey(),
...
});

export const accounts = mysqlTable("accounts", {
...
userId: text("user_id", )
.notNull()
.references(() => users.id, { onDelete: "cascade" }),
});
Get the error:
Error: Referencing column 'user_id' and referenced column 'id' in foreign key constraint 'accounts_user_id_users_id_fk' are incompatible.
Error: Referencing column 'user_id' and referenced column 'id' in foreign key constraint 'accounts_user_id_users_id_fk' are incompatible.
Need to manually edit myself to:
export const sessions = mysqlTable("sessions", {
...
userId: varchar("user_id", { length: 36 })
.notNull()
.references(() => users.id, { onDelete: "cascade" }),
});
export const sessions = mysqlTable("sessions", {
...
userId: varchar("user_id", { length: 36 })
.notNull()
.references(() => users.id, { onDelete: "cascade" }),
});
Using TiDB free tier
2 Replies
KiNFiSH
KiNFiSH5mo ago
TiDB does support some foreign key constraints that why.
Winston
WinstonOP5mo ago
is a foreign key of text to varchar not an error on other mysql providers? and is there a reason why it's not just varchar for all?

Did you find this page helpful?