我正在编写一个使用ODBC连接与MySQL数据库交互的.NET应用程序。我的应用程序将在启动时在数据库上创建数据库模式和表。但是,我在下面遇到了一个奇怪的无法解释的案例:
首先我的应用程序将创建下表
CREATE TABLE IF NOT EXISTS `sample` (
`item_ID` varchar(20) NOT NULL,
`item_No` int(11) NOT NULL,
`sample_col1` varchar(20) NOT NULL,
`sample_col2` varchar(20) NOT NULL,
PRIMARY KEY (`item_ID`, `item_No`)
) ENGINE=InnoDB;
使用
填充表格INSERT INTO sample SET item_ID='abc', item_No=1, sample_col1='', sample_col2='';
INSERT INTO sample SET item_ID='abc', item_No=2, sample_col1='', sample_col2='';
然后我使用以下代码在.NET应用程序中执行SELECT查询:
Dim query As String
query = "SELECT item_ID, item_No, sample_col1, sample_col2 FROM sample"
Dim conn As New OdbcConnection("Driver={MySQL ODBC 5.1 Driver};Server=localhost; port=3306;Database=test; User=dbuser;Password=dbpassword;Option=3;")
Dim cmd As New OdbcDataAdapter(query, conn)
Dim dt As New DataTable
cmd.FillSchema(dt, SchemaType.Source)
cmd.Fill(dt)
conn.Close()
cmd.Fill(dt)
行将抛出异常:“无法启用约束。一行或多行包含违反非null,唯一或外键约束的值”。
但是,如果我将表创建查询修改为:
CREATE TABLE IF NOT EXISTS `sample` (
`item_ID` varchar(20) NOT NULL,
`item_No` int(11) NOT NULL,
`sample_col1` varchar(20) NOT NULL,
`sample_col2` varchar(20) NOT NULL,
PRIMARY KEY (`item_No`,`item_ID`) '--> Here Primary Key order is inverted
) ENGINE=InnoDB;
vb.net代码完美无缺。关于第二个创建查询的注意事项我颠倒了PRIMARY KEY创建的顺序。在第一个示例中,我首先放置item_ID
,而在第二个示例中,我先放置item_No
。
有没有人知道为什么会这样?从第一个和第二个创建查询之间的MySQL数据库的角度来看也有什么不同吗?
任何输入将不胜感激。谢谢!