MySQL 仅当行中先前的值发生更改时才插入新行

标签 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
  • 接下来要像这样插入:
  • 首先插入数据库 ('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/

相关文章:

mysql - SQL只选择不同的最高值

php - 在 Joomla 中显示动态文章列表

mysql - 为特定的人选择最多 "popular"关注者。某人拥有的追随者越多,他们的 "popular"就越多

Python Twistd MySQL - 获取更新的行 ID(不插入)

php - MySQL AES 解密返回值

php - 使用 API/函数调用或使用 Cron Job 方法 - 处理事务的查询 - 你将如何处理它?

mysql - 使用mysql查询从两个表生成账单

java - hibernate 错误 : java.sql.SQLException: Access denied for user 'root ' @'localhost' (using password: YES)

mysql - 连接字符串以指定字段名称

MySQL alter table add column with primary key 语法错误