programing

MySQL과 SQLite 양쪽에 고유한 제약 및 삽입 또는 업데이트

firstcheck 2023. 1. 31. 20:55
반응형

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 。AUTOINCREMENTKEY( 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그리고.dateunique, 테이블에 고유한 구속조건을 추가했습니다.새 행을 삽입하거나 기존 행을 '업데이트'하려면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

반응형