使用SELECT的MySQL INSERT记录

时间:2014-07-24 07:49:46

标签: mysql

我有两张表tblcitytblcityx

--
-- 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的城市,它是否仍然可以添加新记录?

对于专家来说可能是直截了当的,但我无法找到方法。

3 个答案:

答案 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

如果两个表具有相同的结构,则可以使用别名来消除命名歧义。

这里是示例"如何给出别名"

http://www.w3schools.com/sql/sql_alias.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 ...
}