只有当行中的先前值发生更改时,MySQL才会插入新行

时间:2014-12-30 16:29:03

标签: mysql sql

我需要在数据库中插入一个新行,然后才会在行中的前一个值发生更改时添加。

--
-- Table structure
--
CREATE TABLE IF NOT EXISTS `macip` (
  `intId` int(11) NOT NULL AUTO_INCREMENT,
  `strPort` varchar(255) NOT NULL,
  `strIp` varchar(255) DEFAULT NULL,
  `strVlan` varchar(255) DEFAULT NULL,
  `strMac` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`intId`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;

--
-- Test data
--
INSERT INTO `macip` (`intId`, `strPort`, `strIp`, `strVlan`, `strMac`) VALUES
(1, 'Gig1/0/1', '192.168.100.8', '10', 'AA-BB'),
(2, 'Gig1/0/1', '192.168.100.8', '10', 'CC-DD'),
(6, 'Gig1/0/1', '192.168.100.8', '20', 'AA-BB');
  • 我有一个不变的专栏 strPort
  • 接下来想要像这样执行INSERT:
  • 首先插入数据库(' Gig1 / 0/1',' 192.168.100.8',' 10',' AA-BB&# 39;)=>做INSERT
  • 下一步插入数据库(' Gig1 / 0/1',' 192.168.100.8',' 10',' AA-BB&# 39;)=>不要插入,存在
  • 下一步插入数据库(' Gig1 / 0/1',' 192.168.100.8',' 10',' XX-EE&# 39;)=>插入,更改MAC(或IP或VLAN或所有这两个/三个值)
  • 下一步插入数据库(' Gig1 / 0/1',' 192.168.100.8',' 10',' XX-EE&# 39;)=>不要插入,存在
  • 下一步插入数据库(' Gig1 / 0/1',' 192.168.100.8',' 10',' AA-BB&# 39;)=>做插入,更改MAC(或IP或VLAN或所有这两个/三个值),但我的SQL查询中存在问题,因为该值存在于表中,我需要与strPort的前一行进行比较

此查询无效:

INSERT INTO macip (strPort, strIp, strVlan, strMac)
SELECT * FROM (SELECT 'Gig1/0/1', '192.168.100.8', '10', 'AA-BB') AS tmp
WHERE NOT EXISTS (
    SELECT strIp, strVlan, strMac FROM macip WHERE 
    strIp = '192.168.100.8' AND strVlan = '10' AND strMac = 'AA-BB' 
    ORDER BY macip.`strPort` DESC LIMIT 1
) LIMIT 1;

我无法对列执行唯一键,因为SQL查询返回Exception。

1 个答案:

答案 0 :(得分:1)

如何创建unique约束/索引以防止出现此问题?

create unique index idx_macip_strip_strvlan_strMac on macip(strIp, strVlan, strMac);

然后你可以insert作为:

INSERT INTO macip (strPort, strIp, strVlan, strMac)
    SELECT 'Gig1/0/1', '192.168.100.8', '10', 'AA-BB'
    ON DUPLICATE KEY SET strPort = VALUES(strPort);

ON DUPLICATE KEY部分只会阻止INSERT在出现重复时返回错误。