我需要将新行插入数据库,然后仅当该行中的先前值发生更改时才插入。
--
-- 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
- 接下来要像这样插入:
- 首先插入数据库 ('Gig1/0/1', '192.168.100.8', '10', 'AA-BB') = > 执行 INSERT
- 接下来插入数据库 ('Gig1/0/1', '192.168.100.8', '10', 'AA-BB') => 不插入,存在
- 接下来插入数据库('Gig1/0/1'、'192.168.100.8'、'10'、'XX-EE')=> 插入、更改 MAC(或 IP 或 VLAN 或所有这两个/三个)值)
- 接下来插入数据库 ('Gig1/0/1', '192.168.100.8', '10', 'XX-EE') => 不插入,存在
- 接下来插入数据库('Gig1/0/1'、'192.168.100.8'、'10'、'AA-BB')=> 插入、更改 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 查询返回异常。
最佳答案
如何仅创建一个唯一
约束/索引来防止此问题?
create unique index idx_macip_strip_strvlan_strMac on macip(strIp, strVlan, strMac);
然后您可以执行插入
:
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
在存在重复项时返回错误。
关于MySQL 仅当行中先前的值发生更改时才插入新行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27708992/