}
# Generate the CREATE sql
+
+ my @foreign_constraints = (); # these need to be added separately, as tables may not exist yet
+
for my $table ( $schema->get_tables ) {
my $table_name = $table->name or next;
my $table_name_ur = unreserve($table_name) || '';
elsif ( $data_type eq 'set' ) {
$data_type .= 'character varying';
}
+ elsif ( grep { $data_type eq $_ } qw/bytea blob clob/ ) {
+ $data_type = 'varbinary';
+ }
else {
if ( defined $translate{ $data_type } ) {
$data_type = $translate{ $data_type };
next unless @fields;
my $c_def;
- if ( $type eq PRIMARY_KEY ) {
- $name ||= mk_name( $table_name . '_pk' );
- $c_def =
- "CONSTRAINT $name PRIMARY KEY ".
- '(' . join( ', ', @fields ) . ')';
- }
- elsif ( $type eq FOREIGN_KEY ) {
+ if ( $type eq FOREIGN_KEY ) {
$name ||= mk_name( $table_name . '_fk' );
my $on_delete = uc ($constraint->on_delete || '');
my $on_update = uc ($constraint->on_update || '');
}
$c_def =
- "CONSTRAINT $name FOREIGN KEY".
+ "ALTER TABLE $table_name ADD CONSTRAINT $name FOREIGN KEY".
' (' . join( ', ', @fields ) . ') REFERENCES '.
$constraint->reference_table.
- ' (' . join( ', ', @rfields ) . ')';
+ ' (' . join( ', ', @rfields ) . ')'
+ ;
+
if ( $on_delete && $on_delete ne "NO ACTION") {
$c_def .= " ON DELETE $on_delete";
}
if ( $on_update && $on_update ne "NO ACTION") {
$c_def .= " ON UPDATE $on_update";
}
+
+ $c_def .= ";";
+
+ push @foreign_constraints, $c_def;
+ next;
+ }
+
+
+ if ( $type eq PRIMARY_KEY ) {
+ $name ||= mk_name( $table_name . '_pk' );
+ $c_def =
+ "CONSTRAINT $name PRIMARY KEY ".
+ '(' . join( ', ', @fields ) . ')';
}
elsif ( $type eq UNIQUE ) {
$name ||= mk_name( $table_name . '_uc' );
);
}
+# Add FK constraints
+ $output .= join ("\n", '', @foreign_constraints) if @foreign_constraints;
+
# create view/procedure are NOT prepended to the input $sql, needs
# to be filled in with the proper syntax