2014-12-30 3 views
0

데이터베이스에 새 행을 삽입하고 행의 이전 값이 변경된 경우에만 필요합니다.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 쿼리가 예외를 반환하기 때문에 열에 대해 고유 키를 수행 할 수 없습니다.

+0

고유 한 값 집합을 적용하고 오류를 처리하려는 필드에 대해 고유 한 인덱스를 작성하기 만하면됩니다. 또는 '중복 키 업데이트 삽입'방식을 사용할 수도 있습니다. –

+0

그냥 명확히하기 위해 테이블의 _all_ 행이 아닌 동일한 strport로 마지막으로 삽입 된 행에 대한 변경 사항을 확인하려고합니까? –

+0

to Mike Brant : Hello, unique constraint/index 스크립트에서 데이터베이스 함수를 호출하면 스크립트가 error ($ resSqlQuery = mysqli_query ($ this-> LinkIdentifier, $ strSqlQuery);)를 반환하기 때문에 사용하고 싶지 않습니다. ON DUPLICATE KEY SET 모든 히스토리 데이터를 저장해야하므로 사용할 수 없습니다. – czWolfHunter

답변

1

단지이 문제를 방지하기 위해 unique 제약 조건/색인을 만드는 것은 어떻습니까?

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 방지 :

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

그런 다음 당신은 insert로 할 수 있습니다.

+0

고유 한 제약 조건/색인 스크립트에서 데이터베이스 함수를 호출하면 스크립트에서 오류를 반환하므로 사용하지 않으려 고합니다. $ resSqlQuery = mysqli_query ($ this-> LinkIdentifier, $ strSqlQuery);). ON DUPLICATE KEY SET 모든 히스토리 데이터를 저장해야하므로 사용할 수 없습니다. – czWolfHunter

+0

@czWolfHunter. . . 귀하의 의견은 귀하의 질문과 관련하여 이해가되지 않습니다. 제안 된 쿼리는 행이 삽입되는 것을 방지하는 것과 동일한 방식으로 행이 삽입되는 것을 방지합니다. –

관련 문제