sub field_autoinc { ( $_[1]->is_auto_increment ? 'IDENTITY' : () ) }
+sub primary_key_constraint {
+ 'CONSTRAINT ' .
+ $_[0]->quote($_[1]->name || $_[1]->table->name . '_pk') .
+ ' PRIMARY KEY (' .
+ join( ', ', map $_[0]->quote($_), $_[1]->fields ) .
+ ')'
+}
+
+sub index {
+ 'CREATE INDEX ' .
+ $_[0]->quote($_[1]->name || $_[1]->table->name . '_idx') .
+ ' ON ' . $_[0]->quote($_[1]->table->name) .
+ ' (' . join( ', ', map $_[0]->quote($_), $_[1]->fields ) . ');'
+}
+
+sub unique_constraint_single {
+ my ($self, $constraint) = @_;
+
+ 'CONSTRAINT ' .
+ $self->unique_constraint_name($constraint) .
+ ' UNIQUE (' . join( ', ', map $self->quote($_), $constraint->fields ) . ')'
+}
+
+sub unique_constraint_name {
+ my ($self, $constraint) = @_;
+ $self->quote($constraint->name || $constraint->table->name . '_uc' )
+}
+
+sub unique_constraint_multiple {
+ my ($self, $constraint) = @_;
+
+ 'CREATE UNIQUE NONCLUSTERED INDEX ' .
+ $self->unique_constraint_name($constraint) .
+ ' ON ' . $self->quote($constraint->table->name) . ' (' .
+ join( ', ', $constraint->fields ) . ')' .
+ ' WHERE ' . join( ' AND ',
+ map $self->quote($_->name) . ' IS NOT NULL',
+ grep { $_->is_nullable } $constraint->fields ) . ';'
+}
+
+sub foreign_key_constraint {
+ my ($self, $constraint) = @_;
+
+ my $on_delete = uc ($constraint->on_delete || '');
+ my $on_update = uc ($constraint->on_update || '');
+
+ # The default implicit constraint action in MSSQL is RESTRICT
+ # but you can not specify it explicitly. Go figure :)
+ for (map uc $_ || '', $on_delete, $on_update) {
+ undef $_ if $_ eq 'RESTRICT'
+ }
+
+ 'ALTER TABLE ' . $self->quote($constraint->table->name) .
+ ' ADD CONSTRAINT ' .
+ $self->quote($constraint->name || $constraint->table->name . '_fk') .
+ ' FOREIGN KEY' .
+ ' (' . join( ', ', map $self->quote($_), $constraint->fields ) . ') REFERENCES '.
+ $self->quote($constraint->reference_table) .
+ ' (' . join( ', ', map $self->quote($_), $constraint->reference_fields ) . ')'
+ . (
+ $on_delete && $on_delete ne "NO ACTION"
+ ? ' ON DELETE ' . $on_delete
+ : ''
+ ) . (
+ $on_update && $on_update ne "NO ACTION"
+ ? ' ON UPDATE ' . $on_update
+ : ''
+ ) . ';';
+}
+
+sub enum_constraint_name {
+ my ($self, $field_name) = @_;
+ $self->quote($field_name . '_chk' )
+}
+
+sub enum_constraint {
+ my ( $self, $field_name, $vals ) = @_;
+
+ return (
+ 'CONSTRAINT ' . $self->enum_constraint_name($field_name) .
+ ' CHECK (' . $self->quote($field_name) .
+ ' IN (' . join( ',', map qq('$_'), @$vals ) . '))'
+ )
+}
+
1;