데이터베이스에 새 행을 삽입하고 행의 이전 값이 변경된 경우에만 필요합니다.MySQL은 행의 이전 값이 변경된 경우에만 새 행을 삽입합니다.
--
-- 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'을, ('Gig1/0/1', '192.168.100.8', '10', 'AA-BB') => 다음에 삽입하십시오. 삽입, 존재 함
- 다음 데이터베이스에 삽입 ('Gig1/0/1', '192.168.100.8', '10', 'XX-EE') => inse rt, 변경된 MAC (또는 IP 또는 VLAN 또는 모든이 2/3 값)
- 다음 데이터베이스 ('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 쿼리가 예외를 반환하기 때문에 열에 대해 고유 키를 수행 할 수 없습니다.
고유 한 값 집합을 적용하고 오류를 처리하려는 필드에 대해 고유 한 인덱스를 작성하기 만하면됩니다. 또는 '중복 키 업데이트 삽입'방식을 사용할 수도 있습니다. –
그냥 명확히하기 위해 테이블의 _all_ 행이 아닌 동일한 strport로 마지막으로 삽입 된 행에 대한 변경 사항을 확인하려고합니까? –
to Mike Brant : Hello, unique constraint/index 스크립트에서 데이터베이스 함수를 호출하면 스크립트가 error ($ resSqlQuery = mysqli_query ($ this-> LinkIdentifier, $ strSqlQuery);)를 반환하기 때문에 사용하고 싶지 않습니다. ON DUPLICATE KEY SET 모든 히스토리 데이터를 저장해야하므로 사용할 수 없습니다. – czWolfHunter