Indexes & Constraints
Constraints
SQL ์ ์ฝ ์กฐ๊ฑด์ ํ
์ด๋ธ ์ปฌ๋ผ์ ์ ์ฉ๋๋ ๊ท์น์
๋๋ค. ์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์๋ชป๋ ๋ฐ์ดํฐ๊ฐ ์
๋ ฅ๋๋ ๊ฒ์ ๋ฐฉ์งํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
์ด๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ด ๋ฐ์ดํฐ์ ์ ํ์ฑ๊ณผ ์ ๋ขฐ์ฑ์ ๋ณด์ฅํฉ๋๋ค.
Default
DEFAULT ์ ์ INSERT ์ ์ฌ์ฉ์๊ฐ ๊ฐ์ ์ ๊ณตํ์ง ์์ ๊ฒฝ์ฐ ์ปฌ๋ผ์ ์ฌ์ฉํ ๊ธฐ๋ณธ๊ฐ์ ์ง์ ํฉ๋๋ค.
์ปฌ๋ผ ์ ์์ ๋ช
์์ ์ธ DEFAULT ์ ์ด ์์ผ๋ฉด,
์ปฌ๋ผ์ ๊ธฐ๋ณธ๊ฐ์ NULL์
๋๋ค.
๋ช
์์ ์ธ DEFAULT ์ ์ ๊ธฐ๋ณธ๊ฐ์ด NULL, ๋ฌธ์์ด ์์, blob ์์, ๋ถํธ ์๋ ์ซ์ ๋๋ ๊ดํธ๋ก ๋ฌถ์ธ ์์ ํํ์์์ ์ง์ ํ ์ ์์ต๋๋ค.
import { sql } from "drizzle-orm" ;
import { integer , uuid , pgTable } from "drizzle-orm/pg-core" ;
const table = pgTable ( 'table' , {
integer1 : integer ( 'integer1' ) .default ( 42 ) ,
integer2 : integer ( 'integer2' ) .default ( sql `'42'::integer` ) ,
uuid1 : uuid ( 'uuid1' ) .defaultRandom () ,
uuid2 : uuid ( 'uuid2' ) .default ( sql `gen_random_uuid()` ) ,
}); CREATE TABLE IF NOT EXISTS "table" (
"integer1" integer DEFAULT 42 ,
"integer2" integer DEFAULT '42' :: integer ,
"uuid1" uuid DEFAULT gen_random_uuid(),
"uuid2" uuid DEFAULT gen_random_uuid()
); import { sql } from "drizzle-orm" ;
import { int , time , mysqlTable } from "drizzle-orm/mysql-core" ;
const table = mysqlTable ( "table" , {
int : int ( "int" ) .default ( 42 ) ,
time : time ( "time" ) .default ( sql `cast("14:06:10" AS TIME)` ) ,
}); CREATE TABLE ` table ` (
`int` int DEFAULT 42 ,
`time` time DEFAULT cast ( "14:06:10" AS TIME )
); import { sql } from "drizzle-orm" ;
import { integer , sqliteTable } from "drizzle-orm/sqlite-core" ;
const table = sqliteTable ( 'table' , {
int1 : integer ( 'int1' ) .default ( 42 ) ,
int2 : integer ( 'int2' ) .default ( sql `(abs(42))` )
});
CREATE TABLE ` table ` (
`int1` integer DEFAULT 42
`int2` integer DEFAULT ( abs ( 42 ))
); import { sql } from "drizzle-orm" ;
import { int , time , singlestoreTable } from "drizzle-orm/singlestore-core" ;
const table = singlestoreTable ( "table" , {
int : int ( "int" ) .default ( 42 ) ,
time : time ( "time" ) .default ( sql `cast("14:06:10" AS TIME)` ) ,
}); CREATE TABLE ` table ` (
`int` int DEFAULT 42 ,
`time` time DEFAULT cast ( "14:06:10" AS TIME )
);
Not null
๊ธฐ๋ณธ์ ์ผ๋ก ์ปฌ๋ผ์ NULL ๊ฐ์ ๊ฐ์ง ์ ์์ต๋๋ค. NOT NULL ์ ์ฝ ์กฐ๊ฑด์ ์ปฌ๋ผ์ด NULL ๊ฐ์ ํ์ฉํ์ง ์๋๋ก ๊ฐ์ ํฉ๋๋ค.
์ด๋ ํ๋๊ฐ ํญ์ ๊ฐ์ ํฌํจํ๋๋ก ๊ฐ์ ํ๋ฏ๋ก, ์ด ํ๋์ ๊ฐ์ ์ถ๊ฐํ์ง ์๊ณ ๋ ์ ๋ ์ฝ๋๋ฅผ ์ฝ์
ํ๊ฑฐ๋ ๋ ์ฝ๋๋ฅผ ์
๋ฐ์ดํธํ ์ ์์ต๋๋ค.
import { integer , pgTable } from "drizzle-orm/pg-core" ;
const table = pgTable ( 'table' , {
integer : integer ( 'integer' ) .notNull () ,
}); CREATE TABLE IF NOT EXISTS "table" (
"integer" integer NOT NULL
); import { int , mysqlTable } from "drizzle-orm/mysql-core" ;
const table = mysqlTable ( 'table' , {
int : int ( 'int' ) .notNull () ,
}); CREATE TABLE ` table ` (
`int` int NOT NULL
); const table = sqliteTable ( 'table' , {
numInt : integer ( 'numInt' ) .notNull ()
}); CREATE TABLE table (
`numInt` integer NOT NULL
); import { int , singlestoreTable } from "drizzle-orm/singlestore-core" ;
const table = singlestoreTable ( 'table' , {
int : int ( 'int' ) .notNull () ,
}); CREATE TABLE ` table ` (
`int` int NOT NULL
);
Unique
UNIQUE ์ ์ฝ ์กฐ๊ฑด์ ์ปฌ๋ผ์ ๋ชจ๋ ๊ฐ์ด ์๋ก ๋ค๋ฅด๋๋ก ๋ณด์ฅํฉ๋๋ค.
UNIQUE์ PRIMARY KEY ์ ์ฝ ์กฐ๊ฑด ๋ชจ๋ ์ปฌ๋ผ ๋๋ ์ปฌ๋ผ ์งํฉ์ ๋ํ ๊ณ ์ ์ฑ์ ๋ณด์ฅํฉ๋๋ค.
PRIMARY KEY ์ ์ฝ ์กฐ๊ฑด์ ์๋์ผ๋ก UNIQUE ์ ์ฝ ์กฐ๊ฑด์ ๊ฐ์ต๋๋ค.
ํ
์ด๋ธ๋น ์ฌ๋ฌ ๊ฐ์ UNIQUE ์ ์ฝ ์กฐ๊ฑด์ ๊ฐ์ง ์ ์์ง๋ง, PRIMARY KEY ์ ์ฝ ์กฐ๊ฑด์ ํ
์ด๋ธ๋น ํ๋๋ง ๊ฐ์ง ์ ์์ต๋๋ค.
import { integer , text , unique , pgTable } from "drizzle-orm/pg-core" ;
export const user = pgTable ( 'user' , {
id : integer ( 'id' ) .unique () ,
});
export const table = pgTable ( 'table' , {
id : integer ( 'id' ) .unique ( 'custom_name' ) ,
});
export const composite = pgTable ( 'composite_example' , {
id : integer ( 'id' ) ,
name : text ( 'name' ) ,
} , (t) => [
unique () .on ( t .id , t .name) ,
unique ( 'custom_name' ) .on ( t .id , t .name)
]);
// In Postgres 15.0+ NULLS NOT DISTINCT is available
// This example demonstrates both available usages
export const userNulls = pgTable ( 'user_nulls_example' , {
id : integer ( 'id' ) .unique ( "custom_name" , { nulls : 'not distinct' }) ,
} , (t) => [
unique () .on ( t .id) .nullsNotDistinct ()
]); CREATE TABLE IF NOT EXISTS "composite_example" (
"id" integer ,
"name" text ,
CONSTRAINT "composite_example_id_name_unique" UNIQUE ( "id" , "name" ),
CONSTRAINT "custom_name" UNIQUE ( "id" , "name" )
);
CREATE TABLE IF NOT EXISTS "table" (
"id" integer ,
CONSTRAINT "custom_name" UNIQUE ( "id" )
);
CREATE TABLE IF NOT EXISTS "user" (
"id" integer ,
CONSTRAINT "user_id_unique" UNIQUE ( "id" )
);
CREATE TABLE IF NOT EXISTS "user_nulls_example" (
"id" integer ,
CONSTRAINT "custom_name" UNIQUE NULLS NOT DISTINCT ( "id" ),
CONSTRAINT "user_nulls_example_id_unique" UNIQUE NULLS NOT DISTINCT ( "id" )
); import { int , varchar , unique , mysqlTable } from "drizzle-orm/mysql-core" ;
export const user = mysqlTable ( 'user' , {
id : int ( 'id' ) .unique () ,
});
export const table = mysqlTable ( 'table' , {
id : int ( 'id' ) .unique ( 'custom_name' ) ,
});
export const composite = mysqlTable ( 'composite_example' , {
id : int ( 'id' ) ,
name : varchar ( 'name' , { length : 256 }) ,
} , (t) => [
unique () .on ( t .id , t .name) ,
unique ( 'custom_name' ) .on ( t .id , t .name)
]); CREATE TABLE ` user ` (
`id` int ,
CONSTRAINT `user_id_unique` UNIQUE ( `id` )
);
CREATE TABLE ` table ` (
`id` int ,
CONSTRAINT `custom_name` UNIQUE ( `id` )
);
CREATE TABLE ` composite_example ` (
`id` int ,
`name` varchar ( 256 ),
CONSTRAINT `composite_example_id_name_unique` UNIQUE ( `id` , `name` ),
CONSTRAINT `custom_name` UNIQUE ( `id` , `name` )
); import { int , text , unique , sqliteTable } from "drizzle-orm/sqlite-core" ;
export const user = sqliteTable ( 'user' , {
id : int ( 'id' ) .unique () ,
});
export const table = sqliteTable ( 'table' , {
id : int ( 'id' ) .unique ( 'custom_name' ) ,
});
export const composite = sqliteTable ( 'composite_example' , {
id : int ( 'id' ) ,
name : text ( 'name' ) ,
} , (t) => [
unique () .on ( t .id , t .name) ,
unique ( 'custom_name' ) .on ( t .id , t .name)
]); CREATE TABLE ` user ` (
`id` integer
);
CREATE TABLE ` table ` (
`id` integer
);
CREATE TABLE ` composite_example ` (
`id` integer ,
`name` text
);
CREATE UNIQUE INDEX ` composite_example_id_name_unique ` ON `composite_example` ( `id` , `name` );
CREATE UNIQUE INDEX ` custom_name ` ON `composite_example` ( `id` , `name` );
CREATE UNIQUE INDEX ` custom_name ` ON `table` ( `id` );
CREATE UNIQUE INDEX ` user_id_unique ` ON `user` ( `id` ); import { int , varchar , unique , singlestoreTable } from "drizzle-orm/singlestore-core" ;
export const user = singlestoreTable ( 'user' , {
id : int ( 'id' ) .unique () ,
});
export const table = singlestoreTable ( 'table' , {
id : int ( 'id' ) .unique ( 'custom_name' ) ,
});
export const composite = singlestoreTable ( 'composite_example' , {
id : int ( 'id' ) ,
name : varchar ( 'name' , { length : 256 }) ,
} , (t) => [
unique () .on ( t .id , t .name) ,
unique ( 'custom_name' ) .on ( t .id , t .name)
]); CREATE TABLE ` user ` (
`id` int ,
CONSTRAINT `user_id_unique` UNIQUE ( `id` )
);
CREATE TABLE ` table ` (
`id` int ,
CONSTRAINT `custom_name` UNIQUE ( `id` )
);
CREATE TABLE ` composite_example ` (
`id` int ,
`name` varchar ( 256 ),
CONSTRAINT `composite_example_id_name_unique` UNIQUE ( `id` , `name` ),
CONSTRAINT `custom_name` UNIQUE ( `id` , `name` )
);
Check
CHECK ์ ์ฝ ์กฐ๊ฑด์ ์ปฌ๋ผ์ ์
๋ ฅํ ์ ์๋ ๊ฐ์ ๋ฒ์๋ฅผ ์ ํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
์ปฌ๋ผ์ CHECK ์ ์ฝ ์กฐ๊ฑด์ ์ ์ํ๋ฉด ํด๋น ์ปฌ๋ผ์ ํน์ ๊ฐ๋ง ํ์ฉ๋ฉ๋๋ค.
ํ
์ด๋ธ์ CHECK ์ ์ฝ ์กฐ๊ฑด์ ์ ์ํ๋ฉด ํ์ ๋ค๋ฅธ ์ปฌ๋ผ ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ํน์ ์ปฌ๋ผ์ ๊ฐ์ ์ ํํ ์ ์์ต๋๋ค.
import { sql } from "drizzle-orm" ;
import { check , integer , pgTable , text , uuid } from "drizzle-orm/pg-core" ;
export const users = pgTable (
"users" ,
{
id : uuid () .defaultRandom () .primaryKey () ,
username : text () .notNull () ,
age : integer () ,
} ,
(table) => [
check ( "age_check1" , sql ` ${ table .age } > 21` ) ,
]
); CREATE TABLE IF NOT EXISTS "users" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL ,
"username" text NOT NULL ,
"age" integer ,
CONSTRAINT "age_check1" CHECK ( "users" . "age" > 21 )
); import { sql } from "drizzle-orm" ;
import { check , int , mysqlTable , text } from "drizzle-orm/mysql-core" ;
export const users = mysqlTable (
"users" ,
{
id : int () .primaryKey () ,
username : text () .notNull () ,
age : int () ,
} ,
(table) => [
check ( "age_check1" , sql ` ${ table .age } > 21` )
]
); CREATE TABLE ` users ` (
`id` int NOT NULL ,
`username` text NOT NULL ,
`age` int ,
CONSTRAINT `users_id` PRIMARY KEY ( `id` ),
CONSTRAINT `age_check1` CHECK ( `users` . `age` > 21 )
); import { sql } from "drizzle-orm" ;
import { check , int , sqliteTable , text } from "drizzle-orm/sqlite-core" ;
export const users = sqliteTable (
"users" ,
{
id : int () .primaryKey () ,
username : text () .notNull () ,
age : int () ,
} ,
(table) => [
check ( "age_check1" , sql ` ${ table .age } > 21` )
]
); CREATE TABLE ` users ` (
`id` integer PRIMARY KEY NOT NULL ,
`username` text NOT NULL ,
`age` integer ,
CONSTRAINT "age_check1" CHECK ( "users" . "age" > 21 )
); Currently not supported in SingleStore
Primary Key
PRIMARY KEY ์ ์ฝ ์กฐ๊ฑด์ ํ
์ด๋ธ์ ๊ฐ ๋ ์ฝ๋๋ฅผ ๊ณ ์ ํ๊ฒ ์๋ณํฉ๋๋ค.
๊ธฐ๋ณธ ํค๋ UNIQUE ๊ฐ์ ํฌํจํด์ผ ํ๋ฉฐ, NULL ๊ฐ์ ํฌํจํ ์ ์์ต๋๋ค.
ํ
์ด๋ธ์ ํ๋์ ๊ธฐ๋ณธ ํค๋ง ๊ฐ์ง ์ ์์ผ๋ฉฐ, ์ด ๊ธฐ๋ณธ ํค๋ ๋จ์ผ ๋๋ ์ฌ๋ฌ ์ปฌ๋ผ(ํ๋)์ผ๋ก ๊ตฌ์ฑ๋ ์ ์์ต๋๋ค.
import { serial , text , pgTable } from "drizzle-orm/pg-core" ;
const user = pgTable ( 'user' , {
id : serial ( 'id' ) .primaryKey () ,
});
const table = pgTable ( 'table' , {
id : text ( 'cuid' ) .primaryKey () ,
}); CREATE TABLE IF NOT EXISTS "user" (
"id" serial PRIMARY KEY
);
CREATE TABLE IF NOT EXISTS "table" (
"cuid" text PRIMARY KEY
); import { int , text , mysqlTable } from "drizzle-orm/mysql-core" ;
export const user = mysqlTable ( "user" , {
id : int ( "id" ) .autoincrement () .primaryKey () ,
})
export const table = mysqlTable ( "table" , {
cuid : text ( "cuid" ) .primaryKey () ,
}) CREATE TABLE ` user ` (
`id` int AUTO_INCREMENT PRIMARY KEY NOT NULL
);
CREATE TABLE ` table ` (
`cuid` text PRIMARY KEY NOT NULL
); import { integer , sqliteTable } from "drizzle-orm/sqlite-core" ;
export const user = sqliteTable ( "user" , {
id : integer ( "id" ) .primaryKey () ,
})
export const pet = sqliteTable ( "pet" , {
id : integer ( "id" ) .primaryKey () ,
}) CREATE TABLE ` user ` (
`id` integer PRIMARY KEY AUTOINCREMENT NOT NULL
);
CREATE TABLE ` pet ` (
`id` integer PRIMARY KEY AUTOINCREMENT
) import { int , text , singlestoreTable } from "drizzle-orm/singlestore-core" ;
export const user = singlestoreTable ( "user" , {
id : int ( "id" ) .autoincrement () .primaryKey () ,
})
export const table = singlestoreTable ( "table" , {
cuid : text ( "cuid" ) .primaryKey () ,
}) CREATE TABLE ` user ` (
`id` int AUTO_INCREMENT PRIMARY KEY NOT NULL
);
CREATE TABLE ` table ` (
`cuid` text PRIMARY KEY NOT NULL
);
Composite Primary Key
PRIMARY KEY์ ๋ง์ฐฌ๊ฐ์ง๋ก, ๋ณตํฉ ๊ธฐ๋ณธ ํค๋ ์ฌ๋ฌ ํ๋๋ฅผ ์ฌ์ฉํ์ฌ ํ
์ด๋ธ์ ๊ฐ ๋ ์ฝ๋๋ฅผ ๊ณ ์ ํ๊ฒ ์๋ณํฉ๋๋ค.
Drizzle ORM์ ์ด๋ฅผ ์ํ ๋
๋ฆฝ์ ์ธ primaryKey ์ฐ์ฐ์๋ฅผ ์ ๊ณตํฉ๋๋ค:
import { serial , text , integer , primaryKey , pgTable } from "drizzle-orm/pg-core" ;
export const user = pgTable ( "user" , {
id : serial ( "id" ) .primaryKey () ,
name : text ( "name" ) ,
});
export const book = pgTable ( "book" , {
id : serial ( "id" ) .primaryKey () ,
name : text ( "name" ) ,
});
export const booksToAuthors = pgTable ( "books_to_authors" , {
authorId : integer ( "author_id" ) ,
bookId : integer ( "book_id" ) ,
} , (table) => [
primaryKey ({ columns : [ table .bookId , table .authorId] }) ,
// Or PK with custom name
primaryKey ({ name : 'custom_name' , columns : [ table .bookId , table .authorId] }) ,
]); ...
CREATE TABLE IF NOT EXISTS "books_to_authors" (
"author_id" integer ,
"book_id" integer ,
PRIMARY KEY ( "book_id" , "author_id" )
);
ALTER TABLE "books_to_authors" ADD CONSTRAINT "custom_name" PRIMARY KEY ( "book_id" , "author_id" ); import { int , text , primaryKey , mysqlTable } from "drizzle-orm/mysql-core" ;
export const user = mysqlTable ( "user" , {
id : int ( "id" ) .autoincrement () .primaryKey () ,
name : text ( "name" ) ,
});
export const book = mysqlTable ( "book" , {
id : int ( "id" ) .autoincrement () .primaryKey () ,
name : text ( "name" ) ,
});
export const booksToAuthors = mysqlTable ( "books_to_authors" , {
authorId : int ( "author_id" ) ,
bookId : int ( "book_id" ) ,
} , (table) => [
primaryKey ({ columns : [ table .bookId , table .authorId] }) ,
// Or PK with custom name
primaryKey ({ name : 'custom_name' , columns : [ table .bookId , table .authorId] })
]); ...
CREATE TABLE ` books_to_authors ` (
`author_id` int ,
`book_id` int ,
PRIMARY KEY ( `book_id` , `author_id` )
); import { integer , text , primaryKey , sqliteTable} from "drizzle-orm/sqlite-core" ;
export const user = sqliteTable ( "user" , {
id : integer ( "id" ) .primaryKey ({ autoIncrement : true }) ,
name : text ( "name" ) ,
});
export const book = sqliteTable ( "book" , {
id : integer ( "id" ) .primaryKey ({ autoIncrement : true }) ,
name : text ( "name" ) ,
});
export const bookToAuthor = sqliteTable ( "book_to_author" , {
authorId : integer ( "author_id" ) ,
bookId : integer ( "book_id" ) ,
} , (table) => [
primaryKey ({ columns : [ table .bookId , table .authorId] }) ,
// Or PK with custom name
primaryKey ({ name : 'custom_name' , columns : [ table .bookId , table .authorId] })
]); ...
CREATE TABLE ` book_to_author ` (
`author_id` integer ,
`book_id` integer ,
PRIMARY KEY ( `book_id` , `author_id` )
); import { int , text , primaryKey , mysqlTable } from "drizzle-orm/singlestore-core" ;
export const user = singlestoreTable ( "user" , {
id : int ( "id" ) .autoincrement () .primaryKey () ,
name : text ( "name" ) ,
});
export const book = singlestoreTable ( "book" , {
id : int ( "id" ) .autoincrement () .primaryKey () ,
name : text ( "name" ) ,
});
export const booksToAuthors = singlestoreTable ( "books_to_authors" , {
authorId : int ( "author_id" ) ,
bookId : int ( "book_id" ) ,
} , (table) => [
primaryKey ({ columns : [ table .bookId , table .authorId] }) ,
// Or PK with custom name
primaryKey ({ name : 'custom_name' , columns : [ table .bookId , table .authorId] }) ,
]); ...
CREATE TABLE ` books_to_authors ` (
`author_id` int ,
`book_id` int ,
PRIMARY KEY ( `book_id` , `author_id` )
);
Foreign key
FOREIGN KEY ์ ์ฝ ์กฐ๊ฑด์ ํ
์ด๋ธ ๊ฐ์ ๋งํฌ๋ฅผ ํ๊ดดํ๋ ์์
์ ๋ฐฉ์งํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
FOREIGN KEY๋ ํ ํ
์ด๋ธ์ ํ๋(๋๋ ํ๋ ์งํฉ)๋ก, ๋ค๋ฅธ ํ
์ด๋ธ์ PRIMARY KEY๋ฅผ ์ฐธ์กฐํฉ๋๋ค.
์ธ๋ ํค๊ฐ ์๋ ํ
์ด๋ธ์ ์์ ํ
์ด๋ธ์ด๋ผ๊ณ ํ๊ณ , ๊ธฐ๋ณธ ํค๊ฐ ์๋ ํ
์ด๋ธ์ ์ฐธ์กฐ ํ
์ด๋ธ ๋๋ ๋ถ๋ชจ ํ
์ด๋ธ์ด๋ผ๊ณ ํฉ๋๋ค.
Drizzle ORM์ ์ธ๋ ํค๋ฅผ ์ ์ธํ๋ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
์ปฌ๋ผ ์ ์ธ๋ฌธ์์ ์ธ๋ ํค๋ฅผ ์ ์ธํ ์ ์์ต๋๋ค:
import { serial , text , integer , pgTable } from "drizzle-orm/pg-core" ;
export const user = pgTable ( "user" , {
id : serial ( "id" ) ,
name : text ( "name" ) ,
});
export const book = pgTable ( "book" , {
id : serial ( "id" ) ,
name : text ( "name" ) ,
authorId : integer ( "author_id" ) .references (() => user .id)
}); import { int , text , mysqlTable } from "drizzle-orm/mysql-core" ;
export const user = mysqlTable ( "user" , {
id : int ( "id" ) .primaryKey () .autoincrement () ,
name : text ( "name" ) ,
});
export const book = mysqlTable ( "book" , {
id : int ( "id" ) .primaryKey () .autoincrement () ,
name : text ( "name" ) ,
authorId : int ( "author_id" ) .references (() => user .id)
}); import { integer , text , sqliteTable } from "drizzle-orm/sqlite-core" ;
export const user = sqliteTable ( "user" , {
id : integer ( "id" ) .primaryKey ({ autoIncrement : true }) ,
name : text ( "name" ) ,
});
export const book = sqliteTable ( "book" , {
id : integer ( "id" ) .primaryKey ({ autoIncrement : true }) ,
name : text ( "name" ) ,
authorId : integer ( "author_id" ) .references (() => user .id)
}); Currently not supported in SingleStore
์๊ธฐ ์ฐธ์กฐ๋ฅผ ์ํํ๋ ค๋ ๊ฒฝ์ฐ, TypeScript ์ ํ์ผ๋ก ์ธํด ์ฐธ์กฐ ์ฝ๋ฐฑ์ ๋ํ ๋ฐํ ํ์
์ ๋ช
์์ ์ผ๋ก ์ค์ ํ๊ฑฐ๋ ๋
๋ฆฝ์ ์ธ foreignKey ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
import { serial , text , integer , foreignKey , pgTable , AnyPgColumn } from "drizzle-orm/pg-core" ;
export const user = pgTable ( "user" , {
id : serial ( "id" ) ,
name : text ( "name" ) ,
parentId : integer ( "parent_id" ) .references (() : AnyPgColumn => user .id)
});
// or
export const user = pgTable ( "user" , {
id : serial ( "id" ) ,
name : text ( "name" ) ,
parentId : integer ( "parent_id" ) ,
} , (table) => [
foreignKey ({
columns : [ table .parentId] ,
foreignColumns : [ table .id] ,
name : "custom_fk"
})
]); import { int , text , foreignKey , AnyMySqlColumn , mysqlTable } from "drizzle-orm/mysql-core" ;
export const user = mysqlTable ( "user" , {
id : int ( "id" ) .primaryKey () .autoincrement () ,
name : text ( "name" ) ,
parentId : int ( "parent_id" ) .references (() : AnyMySqlColumn => user .id) ,
});
// or
export const user = mysqlTable ( "user" , {
id : int ( "id" ) .primaryKey () .autoincrement () ,
name : text ( "name" ) ,
parentId : int ( "parent_id" )
} , (table) => [
foreignKey ({
columns : [ table .parentId] ,
foreignColumns : [ table .id] ,
name : "custom_fk"
})
]); import { integer , text , foreignKey , sqliteTable , AnySQLiteColumn } from "drizzle-orm/sqlite-core" ;
export const user = sqliteTable ( "user" , {
id : integer ( "id" ) .primaryKey ({ autoIncrement : true }) ,
name : text ( "name" ) ,
parentId : integer ( "parent_id" ) .references (() : AnySQLiteColumn => user .id)
});
//or
export const user = sqliteTable ( "user" , {
id : integer ( "id" ) .primaryKey ({ autoIncrement : true }) ,
name : text ( "name" ) ,
parentId : integer ( "parent_id" ) ,
} , (table) => [
foreignKey ({
columns : [ table .parentId] ,
foreignColumns : [ table .id] ,
name : "custom_fk"
})
]); Currently not supported in SingleStore
๋ค์ค ์ปฌ๋ผ ์ธ๋ ํค๋ฅผ ์ ์ธํ๋ ค๋ฉด ์ ์ฉ foreignKey ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค:
import { serial , text , foreignKey , pgTable , AnyPgColumn } from "drizzle-orm/pg-core" ;
export const user = pgTable ( "user" , {
firstName : text ( "firstName" ) ,
lastName : text ( "lastName" ) ,
} , (table) => [
primaryKey ({ columns : [ table .firstName , table .lastName]})
]);
export const profile = pgTable ( "profile" , {
id : serial ( "id" ) .primaryKey () ,
userFirstName : text ( "user_first_name" ) ,
userLastName : text ( "user_last_name" ) ,
} , (table) => [
foreignKey ({
columns : [ table .userFirstName , table .userLastName] ,
foreignColumns : [ user .firstName , user .lastName] ,
name : "custom_fk"
})
]) import { int , text , primaryKey , foreignKey , mysqlTable , AnyMySqlColumn } from "drizzle-orm/mysql-core" ;
export const user = mysqlTable ( "user" , {
firstName : text ( "firstName" ) ,
lastName : text ( "lastName" ) ,
} , (table) => [
primaryKey ({ columns : [ table .firstName , table .lastName]})
]);
export const profile = mysqlTable ( "profile" , {
id : int ( "id" ) .autoincrement () .primaryKey () ,
userFirstName : text ( "user_first_name" ) ,
userLastName : text ( "user_last_name" ) ,
} , (table) => [
foreignKey ({
columns : [ table .userFirstName , table .userLastName] ,
foreignColumns : [ user .firstName , user .lastName] ,
name : "custom_name"
})
]); import { integer , text , primaryKey , foreignKey , sqliteTable , AnySQLiteColumn } from "drizzle-orm/sqlite-core" ;
export const user = sqliteTable ( "user" , {
firstName : text ( "firstName" ) ,
lastName : text ( "lastName" ) ,
} , (table) => [
primaryKey ({ columns : [ table .firstName , table .lastName]})
]);
export const profile = sqliteTable ( "profile" , {
id : integer ( "id" ) .primaryKey ({ autoIncrement : true }) ,
userFirstName : text ( "user_first_name" ) ,
userLastName : text ( "user_last_name" ) ,
} , (table) => [
foreignKey ({
columns : [ table .userFirstName , table .userLastName] ,
foreignColumns : [ user .firstName , user .lastName] ,
name : "custom_name"
})
]); Currently not supported in SingleStore
Indexes
Drizzle ORM์ index์ unique index ์ ์ธ์ ์ํ API๋ฅผ ์ ๊ณตํฉ๋๋ค:
import { serial , text , index , uniqueIndex , pgTable } from "drizzle-orm/pg-core" ;
export const user = pgTable ( "user" , {
id : serial ( "id" ) .primaryKey () ,
name : text ( "name" ) ,
email : text ( "email" ) ,
} , (table) => [
index ( "name_idx" ) .on ( table .name) ,
uniqueIndex ( "email_idx" ) .on ( table .email)
]); CREATE TABLE " user " (
...
);
CREATE INDEX " name_idx " ON "user" ( "name" );
CREATE UNIQUE INDEX " email_idx " ON "user" ( "email" ); IMPORTANT
drizzle-kit@0.22.0 ๋ฐ drizzle-orm@0.31.0 ์ด์ ๋ฒ์ ์ ๊ฒฝ์ฐ drizzle-kit์ ์ธ๋ฑ์ค name๊ณผ on() ๋งค๊ฐ๋ณ์๋ง ์ง์ํฉ๋๋ค.
drizzle-kit@0.22.0 ๋ฐ drizzle-orm@0.31.0 ๋ฒ์ ์ดํ๋ถํฐ๋ drizzle-kit์์ ๋ชจ๋ ํ๋๊ฐ ์ง์๋ฉ๋๋ค!
0.31.0๋ถํฐ Drizzle ORM์ ์๋ก์ด ์ธ๋ฑ์ค API๋ ์ธ๋ฑ์ค ์์ฑ์ ์ํ ๋ชจ๋ ๋งค๊ฐ๋ณ์ ์ธํธ๋ฅผ ์ ๊ณตํฉ๋๋ค:
// First example, with `.on()`
index ( 'name' )
.on ( table . column1 .asc () , table . column2 .nullsFirst () , ... ) or .onOnly ( table . column1 .desc () .nullsLast () , table .column2 , ... )
.concurrently ()
.where ( sql `` )
.with ({ fillfactor : '70' })
// Second Example, with `.using()`
index ( 'name' )
.using ( 'btree' , table . column1 .asc () , sql `lower( ${ table .column2 } )` , table . column1 .op ( 'text_ops' ))
.where ( sql `` ) // sql expression
.with ({ fillfactor : '70' }) import { int , text , index , uniqueIndex , mysqlTable } from "drizzle-orm/mysql-core" ;
export const user = mysqlTable ( "user" , {
id : int ( "id" ) .primaryKey () .autoincrement () ,
name : text ( "name" ) ,
email : text ( "email" ) ,
} , (table) => [
index ( "name_idx" ) .on ( table .name) ,
uniqueIndex ( "email_idx" ) .on ( table .email) ,
]); CREATE TABLE ` user ` (
...
);
CREATE INDEX ` name_idx ` ON `user` ( `name` );
CREATE UNIQUE INDEX ` email_idx ` ON `user` ( `email` ); IMPORTANT
ํ์ฌ drizzle-kit์ ์ธ๋ฑ์ค name๊ณผ on() ๋งค๊ฐ๋ณ์๋ง ์ง์ํฉ๋๋ค.
Drizzle ORM์ ์ธ๋ฑ์ค ์์ฑ์ ์ํ ๋ชจ๋ ๋งค๊ฐ๋ณ์ ์ธํธ๋ฅผ ์ ๊ณตํฉ๋๋ค:
// Index declaration reference
index ( "name" )
.on ( table .name)
.algorythm ( "default" ) // "default" | "copy" | "inplace"
.using ( "btree" ) // "btree" | "hash"
.lock ( "default" ) // "none" | "default" | "exclusive" | "shared" import { integer , text , index , uniqueIndex , sqliteTable } from "drizzle-orm/sqlite-core" ;
export const user = sqliteTable ( "user" , {
id : integer ( "id" ) .primaryKey ({ autoIncrement : true }) ,
name : text ( "name" ) ,
email : text ( "email" ) ,
} , (table) => [
index ( "name_idx" ) .on ( table .name) ,
uniqueIndex ( "email_idx" ) .on ( table .email) ,
]); CREATE TABLE ` user ` (
...
);
CREATE INDEX ` name_idx ` ON `user` ( `name` );
CREATE UNIQUE INDEX ` email_idx ` ON `user` ( `email` ); Drizzle ORM์ ์ธ๋ฑ์ค ์์ฑ์ ์ํ ๋ชจ๋ ๋งค๊ฐ๋ณ์ ์ธํธ๋ฅผ ์ ๊ณตํฉ๋๋ค:
// Index declaration reference
index ( "name" )
.on ( table .name)
.where ( sql `...` ) import { int , text , index , uniqueIndex , singlestoreTable } from "drizzle-orm/singlestore-core" ;
export const user = singlestoreTable ( "user" , {
id : int ( "id" ) .primaryKey () .autoincrement () ,
name : text ( "name" ) ,
email : text ( "email" ) ,
} , (table) => [
index ( "name_idx" ) .on ( table .name) ,
uniqueIndex ( "email_idx" ) .on ( table .email) ,
]); CREATE TABLE ` user ` (
...
);
CREATE INDEX ` name_idx ` ON `user` ( `name` );
CREATE UNIQUE INDEX ` email_idx ` ON `user` ( `email` );