我有两张表tblcity
和tblcityx
:
--
-- Table structure for table `tblcity`
--
CREATE TABLE IF NOT EXISTS `tblcity` (
`pkcityid` bigint(20) NOT NULL AUTO_INCREMENT,
`cityname` varchar(255) CHARACTER SET latin1 DEFAULT NULL,
`fkstateid` bigint(20) NOT NULL,
PRIMARY KEY (`pkcityid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;
-- --------------------------------------------------------
--
-- Table structure for table `tblcityx`
--
CREATE TABLE IF NOT EXISTS `tblcityx` (
`pkcityid` bigint(20) NOT NULL AUTO_INCREMENT,
`cityname` varchar(255) CHARACTER SET latin1 DEFAULT NULL,
`fkstateid` bigint(20) NOT NULL,
PRIMARY KEY (`pkcityid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1;
我正在尝试从tblcity
tblcityx
添加新记录。目前,我尝试过:
$cityid = 10; // could be any city id
INSERT INTO `tblcity` (SELECT * FROM `tblcityx` WHERE pkcityid = '$cityid')
两个表都有相同数量的字段,pkcityid
自动递增。
它在tblcity
中添加了一个新的DUPLICATE记录,因为它已经有pkcityid=10
的城市,因此在运行上述查询后,有两条记录pkcityid=10
。
即使tblcity
已经拥有pkcityid
的城市,它是否仍然可以添加新记录?
对于专家来说可能是直截了当的,但我无法找到方法。
答案 0 :(得分:1)
如果pkcityid是您的主键,则无法执行此操作。主键只能在表中存在一次。您可以添加一个时间戳字段,该字段在插入行时自动设置为当前时间戳并将其添加到键中。那么你有一个id和timestamp的组合键,在插入新记录时它是唯一的。
答案 1 :(得分:1)
这是一个例子。 您可以使用您想要的列名称
喜欢这个
INSERT INTO Customers (CustomerName, Country)
SELECT SupplierName, Country FROM Suppliers
WHERE Country='Germany';
查看这个例子,你会知道 http://www.w3schools.com/sql/sql_insert_into_select.asp
如果两个表具有相同的结构,则可以使用别名来消除命名歧义。
这里是示例"如何给出别名"
答案 2 :(得分:1)
您可以通过提供NULL
作为AUTO_INCREMENT
列的值来让MySQL生成新的自动递增值:
INSERT INTO target_table
SELECT NULL, cityname, fkstateid
FROM source_table
WHERE pkcityid = @your_id;
注意:AUTO_INCREMENT
列必须定义为NOT NULL
才能使其正常工作
您可能想要检查目标表中是否存在@your_id。有点像:
if (@your_id does not exist in target_table) {
INSERT INTO target_table SELECT * ...
} else {
INSERT INTO target_table SELECT NULL, cityname ...
}