좋아요, 한 테이블의 고유 레코드를 다른 테이블로 복사하려고 시도한 다음 개의 중복 된 레코드를 제거하기 위해 다시 작성하려고합니다. 아래는 내가하기 위해 사용하는 쿼리입니다.distinct select가 올바르게 작동하지 않음
// create new "temp" table
$Database->Query = "
CREATE TABLE IF NOT EXISTS `TempQuickIcon` (
`ListingID` int(11) NOT NULL,
`QuickIconID` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8
";
$Database->RunQuery();
// insert distinctive values but only for this listing id
$Database->Query = "INSERT INTO TempQuickIcon(`ListingID`,`QuickIconID`) SELECT DISTINCT `ListingID`,`QuickIconID` FROM `_ListingQuickIcon` WHERE `ListingID` = '{$GetNewListingID}'";
$Database->RunQuery();
// delete this listings records from the original table
$Database->NewTransaction();
$Database->Table = "_ListingQuickIcon";
$Database->Conditions = "`ListingID` = '{$GetNewListingID}'";
$Database->DeleteRecord();
// insert records from "temp" table
$Database->Query = "INSERT INTO _ListingQuickIcon(`ListingID`,`QuickIconID`) SELECT DISTINCT `ListingID`,`QuickIconID` FROM `TempQuickIcon`";
$Database->RunQuery();
$Database->Query = "TRUNCATE TABLE `TempQuickIcon`";
$Database->RunQuery();
좋아, 그래서 분명 나는 데이터베이스 래퍼가 있지만 기능적인 문제는 하나씩을 테스트하여 그 안에 없다는 것을 보장했다. 또한 각 쿼리를 하나씩 테스트했으며 프로 시저가 작동합니다.
그러나 쿼리의 전체 시퀀스를 달리 실행하면 스크립트를 실행할 수 있습니다 ... 오류없이 처리하지만 실제로 DISTINCT를 따르지 않는 것처럼 보입니다. 두 개 이상 (if ... if 거기에 여러 개의 중복) TempQuickIcon에 레코드가 있습니다.
그러나 스크립트의 각 부분을 개별적으로 실행하면 DISTINCT가 수행되고 고유 레코드 만 복사됩니다.
나는 어리석은 뭔가이고 내가 어딘가에서 실수를 저지르고 있다는 것을 알고있다. 그러나 나는 그것을 볼 수 없다.
의견이 있으십니까? 나는 내가 할 수있는 것을 분명히 제공 할 것이다.
첫 번째 생각 : NewTransaction()으로 시작한 트랜잭션을 커밋해야합니까? 이 마이그레이션은 "단계별로"실행할 때 세션이 전체 실행으로 열려있는 동안 단일 단계간에 닫힐 수 있기 때문에 차이가 있습니다. –
'CREATE TABLE을 실행하지 않으면 TempQuickIcon LIKE _ListingQuickIcon; '을 실행하고 고유 키를 추가 한 다음 REPLACE INTO TempQuickIcon을 실행하십시오. SELECT * FROM _ListingQuickIcon; DROP TABLE _ListingQuickIcon; TempQuickIcon을 _ListingQuickIcon으로 바꾸십시오; '? – rik
기술적으로 NewTransation() 함수는 INSERT 또는 UPDATE 쿼리를위한 필드를 작성하기 위해 설계된 래퍼 함수이므로 필요하지 않습니다. 궁극적으로, DeleteRecord()는 "DELETE FROM'_ListingQuickIcon' WHERE''$ GetNewListingID '" – David