인덱스와 제약 조건 
제약 조건 
SQL 제약 조건은 테이블 컬럼에 적용되는 규칙입니다. 데이터베이스에 잘못된 데이터가 입력되는 것을 방지하기 위해 사용됩니다.
이를 통해 데이터베이스 내 데이터의 정확성과 신뢰성을 보장할 수 있습니다.
기본값(DEFAULT) 
DEFAULT 절은 사용자가 INSERT를 할 때 값을 제공하지 않았을 경우 컬럼에 사용할 기본값을 지정합니다. 
컬럼 정의에 명시적으로 DEFAULT 절이 없으면, 해당 컬럼의 기본값은 NULL이 됩니다.
명시적인 DEFAULT 절은 기본값을 NULL, 문자열 상수, 블롭 상수, 부호 있는 숫자, 또는 괄호로 둘러싸인 상수 표현식으로 지정할 수 있습니다.
     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)  =>  [{  
  unq :  unique () .on ( t .id ,  t .name) ,  
  unq2 :  unique ( 'custom_name' ) .on ( t .id ,  t .name)  
}]);  
 
// Postgres 15.0+에서는 NULLS NOT DISTINCT를 사용할 수 있습니다.  
// 이 예제는 두 가지 사용법을 보여줍니다.  
export  const  userNulls  =  pgTable ( 'user_nulls_example' ,  {  
  id :  integer ( 'id' ) .unique ( "custom_name" ,  { nulls :  'not distinct'  }) ,  
} ,  (t)  =>  [{  
  unq :  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)  =>  ({  
  unq :  unique () .on ( t .id ,  t .name) ,  
  unq2 :  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)  =>  ({  
  unq :  unique () .on ( t .id ,  t .name) ,  
  unq2 :  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)  =>  ({  
  unq :  unique () .on ( t .id ,  t .name) ,  
  unq2 :  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)  =>  [{  
    checkConstraint :  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)  =>  ({  
    checkConstraint :  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)  =>  ({  
    checkConstraint :  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 )  
);       현재 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)  =>  {  
  return  [{  
    pk :  primaryKey ({ columns :  [ table .bookId ,  table .authorId] }) ,  
    pkWithCustomName :  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)  =>  {  
  return  {  
    pk :  primaryKey ({ columns :  [ table .bookId ,  table .authorId] }) ,  
    pkWithCustomName :  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)  =>  {  
  return  {  
    pk :  primaryKey ({ columns :  [ table .bookId ,  table .authorId] }) ,  
    pkWithCustomName :  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)  =>  {  
  return  {  
    pk :  primaryKey ({ columns :  [ table .bookId ,  table .authorId] }) ,  
    pkWithCustomName :  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)  
});     현재 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)  
});  
 
// 또는  
export  const  user  =  pgTable ( "user" ,  {  
  id :  serial ( "id" ) ,  
  name :  text ( "name" ) ,  
  parentId :  integer ( "parent_id" ) ,  
} ,  (table)  =>  {  
  return  [{  
    parentReference :  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) ,  
});  
 
// 또는  
export  const  user  =  mysqlTable ( "user" ,  {  
  id :  int ( "id" ) .primaryKey () .autoincrement () ,  
  name :  text ( "name" ) ,  
  parentId :  int ( "parent_id" )  
} ,  (table)  =>  {  
  return  {  
    parentReference :  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)  
});  
 
// 또는  
export  const  user  =  sqliteTable ( "user" ,  {  
  id :  integer ( "id" ) .primaryKey ({ autoIncrement :  true  }) ,  
  name :  text ( "name" ) ,  
  parentId :  integer ( "parent_id" ) ,  
} ,  (table)  =>  {  
  return  {  
    parentReference :  foreignKey ({  
      columns :  [ table .parentId] ,  
      foreignColumns :  [ table .id] ,  
      name :  "custom_fk"  
    }) ,  
  };  
});     현재 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)  =>  {  
  return  {  
    pk :  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)  =>  {  
  return  [{  
    userReference :  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)  =>  {  
  return  {  
    pk :  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)  =>  {  
  return  {  
    userReference :  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)  =>  {  
  return  {  
    pk :  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)  =>  {  
  return  {  
    userReference :  foreignKey ({  
      columns :  [ table .userFirstName ,  table .userLastName] ,  
      foreignColumns :  [ user .firstName ,  user .lastName] ,  
      name :  "custom_name"  
    })  
  }  
});     현재 SingleStore에서는 지원되지 않습니다.
       
인덱스 
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)  =>  {  
  return  {  
    nameIdx :  index ( "name_idx" ) .on ( table .name) ,  
    emailIdx :  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를 제공하며, 인덱스 생성에 필요한 모든 파라미터를 설정할 수 있습니다:
// 첫 번째 예제, `.on()` 사용  
index ( 'name' )  
  .on ( table . column1 .asc () ,  table . column2 .nullsFirst () ,  ... ) 또는  .onOnly ( table . column1 .desc () .nullsLast () ,  table .column2 ,  ... )  
  .concurrently ()  
  .where ( sql `` )  
  .with ({ fillfactor :  '70'  })  
 
// 두 번째 예제, `.using()` 사용  
index ( 'name' )  
  .using ( 'btree' ,  table . column1 .asc () ,  sql `lower( ${ table .column2 } )` ,  table . column1 .op ( 'text_ops' ))  
  .where ( sql `` )  // SQL 표현식  
  .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)  =>  {  
  return  {  
    nameIdx :  index ( "name_idx" ) .on ( table .name) ,  
    emailIdx :  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 ( "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)  =>  {  
  return  {  
    nameIdx :  index ( "name_idx" ) .on ( table .name) ,  
    emailIdx :  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 ( "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)  =>  {  
  return  {  
    nameIdx :  index ( "name_idx" ) .on ( table .name) ,  
    emailIdx :  uniqueIndex ( "email_idx" ) .on ( table .email) ,  
  };  
}); CREATE  TABLE  ` user ` (  
  ...  
);  
 
CREATE  INDEX  ` name_idx `  ON  `user`  ( `name` );  
CREATE  UNIQUE INDEX  ` email_idx `  ON  `user`  ( `email` );