Hi,
I can’t see much difference between these 2 SQL scripts, but the one created by Liquibase adds UNIQUE constraints after the table is created instead of doing it as part of the CREATE TABLE statement. For some reason, when I run the Liquibase version on MySQL the foreign keys don’t get created, even though I see an ALTER TABLE statement that adds the foreign key.
Here is the version that Liquibase creates:
- -- *********************************************************************
-- Update Database Script
-- *********************************************************************
-- Change Log: /tmp/changelog.xml
-- Ran at: 29/06/10 12:53 PM
-- Against: root@localhost@jdbc:mysql://localhost:3306/TEST_SCHEMA
-- LiquiBase version: 2.0-rc2-SNAPSHOT
-- *********************************************************************
– Changeset /tmp/changelog.xml::1277830437442-1::root (generated)::(Checksum: 2:32bfb63aab569f7cff744d807770ad27)
CREATE TABLE TEST_SCHEMA
.NOT_NULL_TBL
(INTEGER_PK
INT AUTO_INCREMENT NOT NULL, INTEGER_ID
INT NOT NULL, INTEGER_UNIQ
INT NOT NULL, BIGINT_
BIGINT NOT NULL, BLOB_1MB
BLOB NOT NULL, CHAR_1
CHARACTER(1) NOT NULL, CLOB_1MB
TEXT NOT NULL, DATE_
DATE NOT NULL, DECIMAL_5_0
DECIMAL(5,0) NOT NULL, DOUBLE_
DOUBLE NOT NULL, INTEGER_
INT NOT NULL, REAL_
DOUBLE NOT NULL, SMALLINT_
SMALLINT NOT NULL, TIME_
TIME NOT NULL, TIMESTAMP_
DATETIME NOT NULL, VARCHAR_50
VARCHAR(50) NOT NULL, CONSTRAINT PK_NOT_NULL_TBL
PRIMARY KEY (INTEGER_PK
));
– Changeset /tmp/changelog.xml::1277830437442-2::root (generated)::(Checksum: 2:74fc205b8cef2b6c47316e6226499e9f)
CREATE TABLE TEST_SCHEMA
.NULL_TBL
(INTEGER_PK
INT AUTO_INCREMENT NOT NULL, INTEGER_ID
INT NOT NULL, INTEGER_UNIQ
INT NOT NULL, BIGINT_
BIGINT, BLOB_1MB
BLOB, CHAR_1
CHARACTER(1), CLOB_1MB
TEXT, DATE_
DATE, DECIMAL_5_0
DECIMAL(5,0), DOUBLE_
DOUBLE, INTEGER_
INT, REAL_
DOUBLE, SMALLINT_
SMALLINT, TIME_
TIME, TIMESTAMP_
DATETIME, VARCHAR_50
VARCHAR(50), CONSTRAINT PK_NULL_TBL
PRIMARY KEY (INTEGER_PK
));
– Changeset /tmp/changelog.xml::1277830437442-3::root (generated)::(Checksum: 2:9115beeb6d8eeaa1daa6f281e2325a5a)
CREATE TABLE TEST_SCHEMA
.NULL_WITH_DEFAULT_TBL
(INTEGER_PK
INT AUTO_INCREMENT NOT NULL, INTEGER_ID
INT NOT NULL, INTEGER_UNIQ
INT NOT NULL, BIGINT_
BIGINT DEFAULT 1, CHAR_1
CHARACTER(1) DEFAULT ‘a’, CLOB_1MB
TEXT, DATE_
DATE, DECIMAL_5_5
DECIMAL(5,5) DEFAULT 0, DOUBLE_
DOUBLE DEFAULT 3.14, INTEGER_
INT DEFAULT 1, REAL_
DOUBLE DEFAULT 3.14, SMALLINT_
SMALLINT DEFAULT 1, TIME_
TIME, TIMESTAMP_
DATETIME, VARCHAR_50
VARCHAR(50) DEFAULT ‘abc123’, CONSTRAINT PK_NULL_WITH_DEFAU
PRIMARY KEY (INTEGER_PK
));
– Changeset /tmp/changelog.xml::1277830437442-4::root (generated)::(Checksum: 2:f1d39d91e42b5c298fb65ca6b7887acf)
CREATE TABLE TEST_SCHEMA
.SMALL_TBL
(INTEGER_PK
INT AUTO_INCREMENT NOT NULL, INTEGER_UNIQ
INT NOT NULL, INTEGER_
INT, CONSTRAINT PK_SMALL_TBL
PRIMARY KEY (INTEGER_PK
));
– Changeset /tmp/changelog.xml::1277830437442-5::root (generated)::(Checksum: 2:53fc6636db9cc10bea2e74c91d9243a6)
CREATE TABLE TEST_SCHEMA
.SMALL_TBL_NO_PK
(INTEGER_
INT NOT NULL);
– Changeset /tmp/changelog.xml::1277830437442-6::root (generated)::(Checksum: 2:2be4097154489e3cbd40e5f78c65cb13)
ALTER TABLE TEST_SCHEMA
.NOT_NULL_TBL
ADD CONSTRAINT UNIQ_NOT_NULL_TBL
UNIQUE (INTEGER_UNIQ
);
– Changeset /tmp/changelog.xml::1277830437442-7::root (generated)::(Checksum: 2:e8eb13206370d46b46f034c59c3d9dae)
ALTER TABLE TEST_SCHEMA
.NULL_TBL
ADD CONSTRAINT UNIQ_NULL_TBL
UNIQUE (INTEGER_UNIQ
);
– Changeset /tmp/changelog.xml::1277830437442-8::root (generated)::(Checksum: 2:985438b9e065cdb8f8939ffb60729f6d)
ALTER TABLE TEST_SCHEMA
.NULL_WITH_DEFAULT_TBL
ADD CONSTRAINT UNIQ_NULL_WITH_DEF
UNIQUE (INTEGER_UNIQ
);
– Changeset /tmp/changelog.xml::1277830437442-9::root (generated)::(Checksum: 2:11d0cfe20bd704c97b75372003a9ae64)
ALTER TABLE TEST_SCHEMA
.SMALL_TBL
ADD CONSTRAINT UNIQ_SMALL_TBL_1
UNIQUE (INTEGER_UNIQ
);
– Changeset /tmp/changelog.xml::1277830437442-10::root (generated)::(Checksum: 2:f44ee04280a0c1625a03b0dca3412b82)
ALTER TABLE TEST_SCHEMA
.NULL_TBL
ADD CONSTRAINT FK_0001
FOREIGN KEY (INTEGER_UNIQ
) REFERENCES TEST_SCHEMA
.NOT_NULL_TBL
(INTEGER_UNIQ
) ON UPDATE NO ACTION ON DELETE NO ACTION;
– Changeset /tmp/changelog.xml::1277830437442-11::root (generated)::(Checksum: 2:b57ea876519889039c55be27937abea0)
ALTER TABLE TEST_SCHEMA
.NULL_WITH_DEFAULT_TBL
ADD CONSTRAINT FK_0002
FOREIGN KEY (INTEGER_UNIQ
) REFERENCES TEST_SCHEMA
.NOT_NULL_TBL
(INTEGER_UNIQ
) ON UPDATE NO ACTION ON DELETE NO ACTION;
– Changeset /tmp/changelog.xml::1277830437442-12::root (generated)::(Checksum: 2:98c847005ee3cb97df4794bd5c8e62ad)
CREATE INDEX TEST_INDEX2
ON TEST_SCHEMA
.NOT_NULL_TBL
(INTEGER_
);
– Changeset /tmp/changelog.xml::1277830437442-13::root (generated)::(Checksum: 2:a9d02d3d239ee49d27f58001820e1710)
CREATE INDEX TEST_INDEX1
ON TEST_SCHEMA
.NULL_TBL
(INTEGER_
);
– Changeset /tmp/changelog.xml::1277830437442-14::root (generated)::(Checksum: 2:8dfc4e1891c8ebeb90a8c7eecaf34040)
CREATE UNIQUE INDEX TEST_INDEX3
ON TEST_SCHEMA
.NULL_WITH_DEFAULT_TBL
(BIGINT_
, TIME_
);
– Changeset /tmp/changelog.xml::1277830437442-15::root (generated)::(Checksum: 2:920c8ab469db1bd68adc8ab5c1f0bf45)
CREATE VIEW TEST_SCHEMA
.NULL_AND_NOT_NULL
AS SELECT TEST_SCHEMA.NULL_TBL.INTEGER_PK AS INTEGER_PK,TEST_SCHEMA.NULL_TBL.BIGINT_ AS BIGINT_,TEST_SCHEMA.NULL_TBL.BLOB_1MB AS BLOB_1MB,TEST_SCHEMA.NULL_TBL.CHAR_1 AS CHAR_1,TEST_SCHEMA.NULL_TBL.CLOB_1MB AS CLOB_1MB,TEST_SCHEMA.NULL_TBL.DATE_ AS DATE_,TEST_SCHEMA.NULL_TBL.DECIMAL_5_0 AS DECIMAL_5_0,TEST_SCHEMA.NULL_TBL.DOUBLE_ AS DOUBLE_,TEST_SCHEMA.NULL_TBL.INTEGER_ AS INTEGER_,TEST_SCHEMA.NULL_TBL.REAL_ AS REAL_,TEST_SCHEMA.NULL_TBL.SMALLINT_ AS SMALLINT_,TEST_SCHEMA.NULL_TBL.TIME_ AS TIME_,TEST_SCHEMA.NULL_TBL.TIMESTAMP_ AS TIMESTAMP_,TEST_SCHEMA.NULL_TBL.VARCHAR_50 AS VARCHAR_50 FROM TEST_SCHEMA.NULL_TBL UNION ALL SELECT TEST_SCHEMA.NOT_NULL_TBL.INTEGER_PK AS INTEGER_PK,TEST_SCHEMA.NOT_NULL_TBL.BIGINT_ AS BIGINT_,TEST_SCHEMA.NOT_NULL_TBL.BLOB_1MB AS BLOB_1MB,TEST_SCHEMA.NOT_NULL_TBL.CHAR_1 AS CHAR_1,TEST_SCHEMA.NOT_NULL_TBL.CLOB_1MB AS CLOB_1MB,TEST_SCHEMA.NOT_NULL_TBL.DATE_ AS DATE_,TEST_SCHEMA.NOT_NULL_TBL.DECIMAL_5_0 AS DECIMAL_5_0,TEST_SCHEMA.NOT_NULL_TBL.DOUBLE_ AS DOUBLE_,TEST_SCHEMA.NOT_NULL_TBL.INTEGER_ AS INTEGER_,TEST_SCHEMA.NOT_NULL_TBL.REAL_ AS REAL_,TEST_SCHEMA.NOT_NULL_TBL.SMALLINT_ AS SMALLINT_,TEST_SCHEMA.NOT_NULL_TBL.TIME_ AS TIME_,TEST_SCHEMA.NOT_NULL_TBL.TIMESTAMP_ AS TIMESTAMP_,TEST_SCHEMA.NOT_NULL_TBL.VARCHAR_50 AS VARCHAR_50 FROM TEST_SCHEMA.NOT_NULL_TBL;
and here is the original version that I made by hand, which does create the foreign keys properly:
- -- Changeset /tmp/test_schema.xml::1111111111111-1::root (generated)::(Checksum: 2:056bc56736addda50c7121219bf901ec)
CREATE TABLE `TEST_SCHEMA`.`NOT_NULL_TBL` (
`INTEGER_PK` INT AUTO_INCREMENT NOT NULL,
`INTEGER_ID` INT NOT NULL,
`INTEGER_UNIQ` INT NOT NULL,
`BIGINT_` BIGINT NOT NULL,
`BLOB_1MB` BLOB NOT NULL,
`CHAR_1` CHAR(1) NOT NULL,
`CLOB_1MB` TEXT NOT NULL,
`DATE_` DATE NOT NULL,
`DECIMAL_5_0` DECIMAL(5,0) NOT NULL,
`DOUBLE_` DOUBLE NOT NULL,
`INTEGER_` INT NOT NULL,
`REAL_` REAL NOT NULL,
`SMALLINT_` SMALLINT NOT NULL,
`TIME_` TIME NOT NULL,
`TIMESTAMP_` DATETIME NOT NULL,
`VARCHAR_50` VARCHAR(50) NOT NULL,
CONSTRAINT `PK_NOT_NULL_TBL` PRIMARY KEY (`INTEGER_PK`),
CONSTRAINT `UNIQ_NOT_NULL_TBL` UNIQUE (`INTEGER_UNIQ`)
) ENGINE=INNODB;
– Changeset /tmp/test_schema.xml::1111111111111-2::root (generated)::(Checksum: 2:7c78a789bd7f3a4da25fc7d0cb14f8a3)
CREATE TABLE TEST_SCHEMA
.NULL_TBL
(INTEGER_PK
INT AUTO_INCREMENT NOT NULL,
INTEGER_ID
INT NOT NULL,
INTEGER_UNIQ
INT NOT NULL,
BIGINT_
BIGINT,
BLOB_1MB
BLOB,
CHAR_1
CHAR(1),
CLOB_1MB
TEXT,
DATE_
DATE,
DECIMAL_5_0
DECIMAL(5,0),
DOUBLE_
DOUBLE,
INTEGER_
INT,
REAL_
REAL,
SMALLINT_
SMALLINT,
TIME_
TIME,
TIMESTAMP_
DATETIME,
VARCHAR_50
VARCHAR(50),
CONSTRAINT PK_NULL_TBL
PRIMARY KEY (INTEGER_PK
),
CONSTRAINT UNIQ_NULL_TBL
UNIQUE (INTEGER_UNIQ
)
) ENGINE=INNODB;
– Changeset /tmp/test_schema.xml::1111111111111-3::root (generated)::(Checksum: 2:e93f42f53eda2dfa1f80084e0744837a)
CREATE TABLE TEST_SCHEMA
.NULL_WITH_DEFAULT_TBL
(INTEGER_PK
INT AUTO_INCREMENT NOT NULL,
INTEGER_ID
INT NOT NULL,
INTEGER_UNIQ
INT NOT NULL,
BIGINT_
BIGINT DEFAULT 1,
CHAR_1
CHAR(1) DEFAULT ‘a’,
CLOB_1MB
TEXT,
DATE_
DATE DEFAULT ‘2000-01-01’,
DECIMAL_5_5
DECIMAL(5,5) DEFAULT 0,
DOUBLE_
DOUBLE DEFAULT 3.14,
INTEGER_
INT DEFAULT 1,
REAL_
REAL DEFAULT 3.14,
SMALLINT_
SMALLINT DEFAULT 1,
TIME_
TIME DEFAULT ‘01:23:00’,
TIMESTAMP_
DATETIME,
VARCHAR_50
VARCHAR(50) DEFAULT ‘abc123’,
CONSTRAINT PK_NULL_WITH_DEFAU
PRIMARY KEY (INTEGER_PK
),
CONSTRAINT UNIQ_NULL_WITH_DEF
UNIQUE (INTEGER_UNIQ
)
) ENGINE=INNODB;
– Changeset /tmp/test_schema.xml::1111111111111-4::root (generated)::(Checksum: 2:e93f42f53eda2dfa1f80084e0744837a)
CREATE TABLE TEST_SCHEMA
.SMALL_TBL
(INTEGER_PK
INT AUTO_INCREMENT NOT NULL,
INTEGER_UNIQ
INTEGER NOT NULL,
INTEGER_
INTEGER,
CONSTRAINT PK_SMALL_TBL
PRIMARY KEY (INTEGER_PK
),
CONSTRAINT UNIQ_SMALL_TBL_1
UNIQUE (INTEGER_UNIQ
)
) ENGINE=INNODB;
– Changeset /tmp/test_schema.xml::1111111111111-5::root (generated)::(Checksum: 2:e93f42f53eda2dfa1f80084e0744837a)
CREATE TABLE TEST_SCHEMA
.SMALL_TBL_NO_PK
(
INTEGER_
INTEGER NOT NULL
) ENGINE=INNODB;
– Changeset /tmp/test_schema.xml::2222222222222-1::root (generated)::(Checksum: 2:f44ee04280a0c1625a03b0dca3412b82)
ALTER TABLE TEST_SCHEMA
.NULL_TBL
ADD CONSTRAINT FK_0001
FOREIGN KEY (INTEGER_UNIQ
) REFERENCES NOT_NULL_TBL
(INTEGER_UNIQ
) ON UPDATE NO ACTION ON DELETE NO ACTION;
– Changeset /tmp/test_schema.xml::2222222222222-2::root (generated)::(Checksum: 2:b57ea876519889039c55be27937abea0)
ALTER TABLE TEST_SCHEMA
.NULL_WITH_DEFAULT_TBL
ADD CONSTRAINT FK_0002
FOREIGN KEY (INTEGER_UNIQ
) REFERENCES NOT_NULL_TBL
(INTEGER_UNIQ
) ON UPDATE NO ACTION ON DELETE NO ACTION;
– Changeset /tmp/test_schema.xml::3333333333333-2::root (generated)::(Checksum: 2:98c847005ee3cb97df4794bd5c8e62ad)
CREATE INDEX TEST_INDEX2
ON TEST_SCHEMA
.NOT_NULL_TBL
(INTEGER_
);
– Changeset /tmp/test_schema.xml::3333333333333-3::root (generated)::(Checksum: 2:a9d02d3d239ee49d27f58001820e1710)
CREATE INDEX TEST_INDEX1
ON TEST_SCHEMA
.NULL_TBL
(INTEGER_
);
– Changeset /tmp/test_schema.xml::3333333333333-4::root (generated)::(Checksum: 2:8dfc4e1891c8ebeb90a8c7eecaf34040)
CREATE UNIQUE INDEX TEST_INDEX3
ON TEST_SCHEMA
.NULL_WITH_DEFAULT_TBL
(BIGINT_
,
TIME_
);
– Changeset /tmp/test_schema.xml::1272576312598-12::root (generated)::(Checksum: 2:f9055660845838c9f76ec207bb78ef28)
CREATE VIEW TEST_SCHEMA
.NULL_AND_NOT_NULL
AS SELECT INTEGER_PK,
BIGINT_,
BLOB_1MB,
CHAR_1,
CLOB_1MB,
DATE_,
DECIMAL_5_0,
DOUBLE_,
INTEGER_,
REAL_,
SMALLINT_,
TIME_,
TIMESTAMP_,
VARCHAR_50 FROM TEST_SCHEMA.NULL_TBL UNION ALL SELECT INTEGER_PK,
BIGINT_,
BLOB_1MB,
CHAR_1,
CLOB_1MB,
DATE_,
DECIMAL_5_0,
DOUBLE_,
INTEGER_,
REAL_,
SMALLINT_,
TIME_,
TIMESTAMP_,
VARCHAR_50 FROM TEST_SCHEMA.NOT_NULL_TBL;
Can anyone see why the first one doesn’t create the FK_0001 & FK_0002 foreign keys, but the 2nd one does.
I used the following query in MySQL to verify whether the constraints were created properly:
- select * from information_schema.TABLE_CONSTRAINTS tc where tc.TABLE_SCHEMA = 'TEST_SCHEMA';