MySQL과 SQLite 양쪽에 고유한 제약 및 삽입 또는 업데이트
열 집합을 고유하게 정의한 다음 테이블에 새 항목을 삽입하거나 열이 고유하지 않은 경우 행을 업데이트하는 방법을 찾고 있습니다.몇 가지 조사를 해서 방법을 찾아봤는데 MySQL과 SQLite 모두 호환되는 것을 찾을 수 없었습니다.
다음과 같은 표가 있다고 가정합니다.
CREATE TABLE `users` (
`id` INT NOT NULL AUTO_INCREMENT,
`uuid` VARCHAR ( 64 ) NOT NULL,
`name` VARCHAR ( 32 ) NOT NULL,
`date` BIGINT NULL,
PRIMARY KEY ( id )
);
는 는고되 i i i want want i를 원한다.uuid
★★★★★★★★★★★★★★★★★」date
의 개 할 수 로 하다uuid
1개의 ★★★★★★★★★★★★★.date
, 「」, 「」의 어느 의 경우는 uuid
★★★★★★★★★★★★★★★★★」date
처음에 하고 싶었던 것은 다음과 같은 주요 키를 설정하는 것입니다.
PRIMARY KEY ( uuid, date )
어떤 인지 저는 ,, 어, for, 떤, 어, 어, 어, 습, values, values, values, values, values, values, values, values, values, values에 null 값은 사용할 수 .date
이런 、 때할때 。
이것이 는 잘 .
CONSTRAINT user UNIQUE ( `uuid`, `date` )
같은 합니다.uuid
★★★★★★★★★★★★★★★★★」date
는 이미 존재합니다.만, 와 호환성이 둘 다 되지 않습니다.MySQL과 SQLite의 양쪽 하고 있지 .
INSERT INTO ... ON DUPLICATE KEY
는 SQLiteSQLite와하지 않습니다.REPLACE INTO
、 [ updating ] 내가 하지 않은 것은 됩니다.
나는 꽤 오랫동안 연구해 왔지만 나에게 맞는 해결책을 찾을 수 없었다.아무쪼록 잘 부탁드립니다.
SQLite 솔루션(mysql에도 동일한 원칙이 적용되어야 함)
UNIQURE 인덱스를 추가하는 것만으로(적어도 이 인덱스의 대상이 되는SQLite의 경우), 다음과 같이 할 수 있습니다.
DROP TABLE IF EXISTS `users`;
CREATE TABLE IF NOT EXISTS `users` (
`id` INTEGER, //<<<<<<<<<< See notes below
`uuid` VARCHAR ( 64 ) NOT NULL,
`name` VARCHAR ( 32 ) NOT NULL,
`date` BIGINT NULL,
PRIMARY KEY ( `id` )
);
CREATE UNIQUE INDEX IF NOT EXISTS uuid_date ON `users` (`uuid`,`date`); //<<<<<<<<<<
: ★
AUTO_INCREMENT
는 키워드가는 SQLite입니다. SQLite sql sql 。AUTOINCREMENT
KEY( INTEGER PRIMAY KEY(또는 INTEGER PRIMAY KEY)를 수 때문에PRIMARY KEY (id)
는 삽입 시 가 자동으로 생성됩니다는 삽입 시 컬럼에 값을 지정하지 않으면 unique ID가 자동으로 생성됩니다.SQLite에는 자동으로 생성된 ID에 INTER가 아닌 INTEGER가 필요합니다.NOT NULL 및 UNIQUICE도 암시되어 있으므로 지정할 필요가 없습니다.
다음 예제에서는 각각 UUID/날짜 조합이 중복되어 삽입되어 업데이트되는 대신 같은 UUID를 삽입하는 두 가지 예를 보여 줍니다.그 반대도 마찬가지입니다.-
INSERT OR REPLACE INTO `users` VALUES(null,'Fred01234567','Fred Bloggs the 1st','20180101');
INSERT OR REPLACE INTO `users` VALUES(null,'Fred01234567','Fred Bloggs the 2nd','20180101'); -- <<<< DUPLICATE
INSERT OR REPLACE INTO `users` VALUES(null,'Fred99999999','Fred Bloggs the 2nd','20180101'); -- <<<< different uuid same date
INSERT OR REPLACE INTO `users` VALUES(null,'Fred01234567','Fred Bloggs the 2nd','99999999'); -- <<<< same uuid different date
INSERT OR REPLACE INTO `users` (`uuid`,'name','date') VALUES('Fred76543210','Fred NotBloggs the 1st','20180202');
INSERT OR REPLACE INTO `users` (`uuid`,'name','date') VALUES('Fred76543210','Fred NotBloggs the 1st','20180202');
INSERT OR REPLACE INTO `users` (`uuid`,'name','date') VALUES('Fred99999999','Fred NotBloggs the 1st','20180202');
INSERT OR REPLACE INTO `users` (`uuid`,'name','date') VALUES('Fred76543210','Fred NotBloggs the 1st','99999999');
SELECT * FROM `users`;
결과는 다음과 같습니다.
MySQL과 SQLite를 모두 사용하여 몇 시간 동안 구글을 검색하여 테스트했는데 제대로 작동하는 솔루션을 찾은 것 같습니다.
을 조합하다uuid
그리고.date
unique, 테이블에 고유한 구속조건을 추가했습니다.새 행을 삽입하거나 기존 행을 '업데이트'하려면REPLACE INTO ... SELECT
.
테이블을 작성하려면:
CREATE TABLE IF NOT EXISTS `users` (
`id` INT NOT NULL AUTO_INCREMENT, // use INTEGER NOT NULL for SQLite
`uuid` VARCHAR ( 64 ) NOT NULL,
`name` VARCHAR ( 32 ) NOT NULL,
`date` BIGINT NULL,
CONSTRAINT `uuid_date` UNIQUE ( `uuid`, `date` ),
PRIMARY KEY ( `id` )
);
그CONSTRAINT
의 조합을 확실히 할 것이다.uuid
그리고.date
항상 유일합니다.
데이터 삽입을 위해REPLACE INTO ... SELECT
여기서 모든 (새로운) 값을 입력합니다.SELECT
값을 지정하지 않은 모든 열의 열 이름을 쿼리하고 입력하여 기존 행을 바꿀 때 값을 삭제하지 않고 그대로 유지합니다.
REPLACE INTO `users`
SELECT `id`, `uuid`, ?, `date`
FROM `users` WHERE `uuid` = ? AND `date` = ?;
이 경우 정규 분포를 사용할 때 손실될 수 있는 열이 없기 때문입니다.REPLACE INTO
다음과 같은 것도 사용할 수 있습니다.
REPLACE INTO `users` ( `uuid`, `name`, `date` ) VALUES ( ?, ?, ? );
하지만, 그REPLACE INTO ... SELECT
쿼리는 더 많은 열이 있는 테이블이 있고 실제로 열을 선택하지 않으면 손실될 수 있는 열이 있을 때 유용합니다.
댓글 많이 달아줘서 미안해요.이것이 내가 당신이 원하는 것을 성취한 방법이다.사용자 테이블에서 기본 키 ID가 손실됩니다.또한 삽입 변수를 테이블로 준비해야 합니다.하지만 당신은 최종 결과를 얻을 것입니다.미안하지만 더 좋은 해결책이 없어요.
DROP TABLE users;
DROP TABLE users2;
CREATE TABLE `users` (
`uuid` VARCHAR ( 64 ) NOT NULL,
`name` VARCHAR ( 32 ) NOT NULL,
`date` BIGINT NULL
);
ALTER TABLE `users` ADD PRIMARY KEY(`uuid`,`date`);
INSERT INTO users (`name`,`uuid`,`date`) SELECT '','123','2018-04-01';
CREATE TABLE `users2` (
`uuid` VARCHAR ( 64 ) NOT NULL,
`name` VARCHAR ( 32 ) NOT NULL,
`date` BIGINT NULL
);
INSERT INTO users2 (`name`,`uuid`,`date`) SELECT 'brad','123','2018-04-01';
REPLACE INTO users SELECT `uuid`,`name`,`date` FROM users2 GROUP BY `uuid`,`date`;
SELECT * FROM users;`
언급URL : https://stackoverflow.com/questions/50950903/unique-constraints-insert-or-update-for-both-mysql-and-sqlite
'programing' 카테고리의 다른 글
MySQL/MariaDB 열 값이 다른 열에서 고유합니다. (0) | 2023.01.31 |
---|---|
JavaScript에서 화살표 키 누름 감지 (0) | 2023.01.31 |
PDO와 마리아DB (0) | 2023.01.31 |
unix 타임스탬프 문자열을 읽을 수 있는 날짜로 변환하는 중 (0) | 2023.01.21 |
열이 있는 경우 변경 (0) | 2023.01.21 |