Hướng dẫn what is if not exists in mysql? - nếu không tồn tại trong mysql là gì?

17.5.1.6 & nbsp; sao chép tạo ... nếu không tồn tại các câu lệnh

MySQL áp dụng các quy tắc này khi các câu lệnh

SELECT DISTINCT store_type FROM stores
  WHERE NOT EXISTS (SELECT * FROM cities_stores
                    WHERE cities_stores.store_type = stores.store_type);
3 khác nhau được sao chép:

  • Mỗi câu lệnh

    SELECT DISTINCT store_type FROM stores
      WHERE NOT EXISTS (SELECT * FROM cities_stores
                        WHERE cities_stores.store_type = stores.store_type);
    4 được nhân rộng, cho dù cơ sở dữ liệu có tồn tại trên nguồn hay không.

  • Tương tự, mỗi câu lệnh

    SELECT DISTINCT store_type FROM stores
      WHERE NOT EXISTS (SELECT * FROM cities_stores
                        WHERE cities_stores.store_type = stores.store_type);
    5 mà không có
    SELECT DISTINCT store_type FROM stores
      WHERE NOT EXISTS (SELECT * FROM cities_stores
                        WHERE cities_stores.store_type = stores.store_type);
    6 được sao chép, cho dù bảng có tồn tại trên nguồn hay không. Điều này bao gồm
    SELECT DISTINCT store_type FROM stores
      WHERE NOT EXISTS (SELECT * FROM cities_stores
                        WHERE cities_stores.store_type = stores.store_type);
    7. Sao chép
    SELECT DISTINCT store_type FROM stores
      WHERE NOT EXISTS (SELECT * FROM cities_stores
                        WHERE cities_stores.store_type = stores.store_type);
    8 tuân theo các quy tắc hơi khác nhau; Xem Phần & NBSP; 17.5.1.7, Bản sao của Bảng tạo ... Chọn các câu lệnh, để biết thêm thông tin.

  • SELECT DISTINCT store_type FROM stores
      WHERE NOT EXISTS (SELECT * FROM cities_stores
                        WHERE cities_stores.store_type = stores.store_type);
    9 luôn được nhân rộng, cho dù sự kiện có tên trong câu lệnh đã tồn tại trên nguồn.

  • SELECT DISTINCT store_type FROM stores s1
      WHERE NOT EXISTS (
        SELECT * FROM cities WHERE NOT EXISTS (
          SELECT * FROM cities_stores
           WHERE cities_stores.city = cities.city
           AND cities_stores.store_type = stores.store_type));
    0 chỉ được ghi vào nhật ký nhị phân nếu thành công. Nếu câu lệnh bao gồm
    SELECT DISTINCT store_type FROM stores s1
      WHERE NOT EXISTS (
        SELECT * FROM cities WHERE NOT EXISTS (
          SELECT * FROM cities_stores
           WHERE cities_stores.city = cities.city
           AND cities_stores.store_type = stores.store_type));
    1, nó được coi là thành công và được ghi lại miễn là ít nhất một người dùng có tên trong câu lệnh được tạo; Trong những trường hợp như vậy, tuyên bố được ghi lại như được viết; Điều này bao gồm các tham chiếu đến người dùng hiện tại không được tạo. Xem Tạo ghi nhật ký nhị phân của người dùng, để biết thêm thông tin.

  • . , hoặc kích hoạt) đã tồn tại.MySQL 8.0.29 and later:)

    SELECT DISTINCT store_type FROM stores s1
      WHERE NOT EXISTS (
        SELECT * FROM cities WHERE NOT EXISTS (
          SELECT * FROM cities_stores
           WHERE cities_stores.city = cities.city
           AND cities_stores.store_type = stores.store_type));
    2,
    SELECT DISTINCT store_type FROM stores s1
      WHERE NOT EXISTS (
        SELECT * FROM cities WHERE NOT EXISTS (
          SELECT * FROM cities_stores
           WHERE cities_stores.city = cities.city
           AND cities_stores.store_type = stores.store_type));
    3, or
    SELECT DISTINCT store_type FROM stores s1
      WHERE NOT EXISTS (
        SELECT * FROM cities WHERE NOT EXISTS (
          SELECT * FROM cities_stores
           WHERE cities_stores.city = cities.city
           AND cities_stores.store_type = stores.store_type));
    4, if successful, is written in its entirety to the binary log (including the
    SELECT DISTINCT store_type FROM stores s1
      WHERE NOT EXISTS (
        SELECT * FROM cities WHERE NOT EXISTS (
          SELECT * FROM cities_stores
           WHERE cities_stores.city = cities.city
           AND cities_stores.store_type = stores.store_type));
    5 clause), whether or not the statement raised a warning because the object (procedure, function, or trigger) already existed.

13.2.11.6 & NBSP; Các nhóm phụ có tồn tại hoặc không tồn tại

Nếu một công cụ con trả về bất kỳ hàng nào,

SELECT DISTINCT store_type FROM stores s1
  WHERE NOT EXISTS (
    SELECT * FROM cities WHERE NOT EXISTS (
      SELECT * FROM cities_stores
       WHERE cities_stores.city = cities.city
       AND cities_stores.store_type = stores.store_type));
6 là
SELECT DISTINCT store_type FROM stores s1
  WHERE NOT EXISTS (
    SELECT * FROM cities WHERE NOT EXISTS (
      SELECT * FROM cities_stores
       WHERE cities_stores.city = cities.city
       AND cities_stores.store_type = stores.store_type));
7 và
SELECT DISTINCT store_type FROM stores s1
  WHERE NOT EXISTS (
    SELECT * FROM cities WHERE NOT EXISTS (
      SELECT * FROM cities_stores
       WHERE cities_stores.city = cities.city
       AND cities_stores.store_type = stores.store_type));
8 là
SELECT DISTINCT store_type FROM stores s1
  WHERE NOT EXISTS (
    SELECT * FROM cities WHERE NOT EXISTS (
      SELECT * FROM cities_stores
       WHERE cities_stores.city = cities.city
       AND cities_stores.store_type = stores.store_type));
9. Ví dụ:

SELECT column1 FROM t1 WHERE EXISTS (SELECT * FROM t2);

Theo truyền thống, một truy vấn con

SELECT column1 FROM t1 WHERE EXISTS (TABLE t2);
0 bắt đầu với
SELECT column1 FROM t1 WHERE EXISTS (TABLE t2);
1, nhưng nó có thể bắt đầu bằng
SELECT column1 FROM t1 WHERE EXISTS (TABLE t2);
2 hoặc
SELECT column1 FROM t1 WHERE EXISTS (TABLE t2);
3 hoặc bất cứ điều gì. MySQL bỏ qua danh sách
SELECT DISTINCT store_type FROM stores
  WHERE NOT EXISTS (SELECT * FROM cities_stores
                    WHERE cities_stores.store_type = stores.store_type);
6 trong một truy vấn con như vậy, vì vậy nó không có gì khác biệt.

Đối với ví dụ trước, nếu

SELECT column1 FROM t1 WHERE EXISTS (TABLE t2);
5 chứa bất kỳ hàng nào, thậm chí các hàng không có gì ngoài các giá trị
SELECT column1 FROM t1 WHERE EXISTS (TABLE t2);
6, điều kiện
SELECT column1 FROM t1 WHERE EXISTS (TABLE t2);
0 là
SELECT DISTINCT store_type FROM stores s1
  WHERE NOT EXISTS (
    SELECT * FROM cities WHERE NOT EXISTS (
      SELECT * FROM cities_stores
       WHERE cities_stores.city = cities.city
       AND cities_stores.store_type = stores.store_type));
7. Đây thực sự là một ví dụ không thể xảy ra bởi vì một truy vấn con
SELECT column1 FROM t1 WHERE EXISTS (TABLE t2);
9 hầu như luôn luôn chứa các mối tương quan. Dưới đây là một số ví dụ thực tế hơn:

  • Những loại cửa hàng có mặt trong một hoặc nhiều thành phố?

    SELECT DISTINCT store_type FROM stores
      WHERE EXISTS (SELECT * FROM cities_stores
                    WHERE cities_stores.store_type = stores.store_type);
  • Loại cửa hàng nào có mặt ở No City?

    SELECT DISTINCT store_type FROM stores
      WHERE NOT EXISTS (SELECT * FROM cities_stores
                        WHERE cities_stores.store_type = stores.store_type);
  • Những loại cửa hàng có mặt ở tất cả các thành phố?

    SELECT DISTINCT store_type FROM stores s1
      WHERE NOT EXISTS (
        SELECT * FROM cities WHERE NOT EXISTS (
          SELECT * FROM cities_stores
           WHERE cities_stores.city = cities.city
           AND cities_stores.store_type = stores.store_type));

Ví dụ cuối cùng là truy vấn

CREATE TABLE `transcripts` (
`ensembl_transcript_id` varchar(20) NOT NULL,
`transcript_chrom_start` int(10) unsigned NOT NULL,
`transcript_chrom_end` int(10) unsigned NOT NULL,
PRIMARY KEY (`ensembl_transcript_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
0 được lồng đôi. Đó là, nó có một mệnh đề
CREATE TABLE `transcripts` (
`ensembl_transcript_id` varchar(20) NOT NULL,
`transcript_chrom_start` int(10) unsigned NOT NULL,
`transcript_chrom_end` int(10) unsigned NOT NULL,
PRIMARY KEY (`ensembl_transcript_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
0 trong mệnh đề
CREATE TABLE `transcripts` (
`ensembl_transcript_id` varchar(20) NOT NULL,
`transcript_chrom_start` int(10) unsigned NOT NULL,
`transcript_chrom_end` int(10) unsigned NOT NULL,
PRIMARY KEY (`ensembl_transcript_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
2. Chính thức, nó trả lời câu hỏi mà một thành phố có tồn tại với một cửa hàng không có trong
CREATE TABLE `transcripts` (
`ensembl_transcript_id` varchar(20) NOT NULL,
`transcript_chrom_start` int(10) unsigned NOT NULL,
`transcript_chrom_end` int(10) unsigned NOT NULL,
PRIMARY KEY (`ensembl_transcript_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
3 không? Nhưng dễ dàng hơn để nói rằng một
CREATE TABLE `transcripts` (
`ensembl_transcript_id` varchar(20) NOT NULL,
`transcript_chrom_start` int(10) unsigned NOT NULL,
`transcript_chrom_end` int(10) unsigned NOT NULL,
PRIMARY KEY (`ensembl_transcript_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
2 được lồng vào câu hỏi là
CREATE TABLE `transcripts` (
`ensembl_transcript_id` varchar(20) NOT NULL,
`transcript_chrom_start` int(10) unsigned NOT NULL,
`transcript_chrom_end` int(10) unsigned NOT NULL,
PRIMARY KEY (`ensembl_transcript_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
5
SELECT DISTINCT store_type FROM stores s1
  WHERE NOT EXISTS (
    SELECT * FROM cities WHERE NOT EXISTS (
      SELECT * FROM cities_stores
       WHERE cities_stores.city = cities.city
       AND cities_stores.store_type = stores.store_type));
7 cho tất cả
CREATE TABLE `transcripts` (
`ensembl_transcript_id` varchar(20) NOT NULL,
`transcript_chrom_start` int(10) unsigned NOT NULL,
`transcript_chrom_end` int(10) unsigned NOT NULL,
PRIMARY KEY (`ensembl_transcript_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
7?does a city exist with a store that is not in
CREATE TABLE `transcripts` (
`ensembl_transcript_id` varchar(20) NOT NULL,
`transcript_chrom_start` int(10) unsigned NOT NULL,
`transcript_chrom_end` int(10) unsigned NOT NULL,
PRIMARY KEY (`ensembl_transcript_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
3
? But it is easier to say that a nested
CREATE TABLE `transcripts` (
`ensembl_transcript_id` varchar(20) NOT NULL,
`transcript_chrom_start` int(10) unsigned NOT NULL,
`transcript_chrom_end` int(10) unsigned NOT NULL,
PRIMARY KEY (`ensembl_transcript_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
2 answers the question is
CREATE TABLE `transcripts` (
`ensembl_transcript_id` varchar(20) NOT NULL,
`transcript_chrom_start` int(10) unsigned NOT NULL,
`transcript_chrom_end` int(10) unsigned NOT NULL,
PRIMARY KEY (`ensembl_transcript_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
5
SELECT DISTINCT store_type FROM stores s1
  WHERE NOT EXISTS (
    SELECT * FROM cities WHERE NOT EXISTS (
      SELECT * FROM cities_stores
       WHERE cities_stores.city = cities.city
       AND cities_stores.store_type = stores.store_type));
7 for all
CREATE TABLE `transcripts` (
`ensembl_transcript_id` varchar(20) NOT NULL,
`transcript_chrom_start` int(10) unsigned NOT NULL,
`transcript_chrom_end` int(10) unsigned NOT NULL,
PRIMARY KEY (`ensembl_transcript_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
7?

Trong MySQL 8.0.19 và sau đó, bạn cũng có thể sử dụng

CREATE TABLE `transcripts` (
`ensembl_transcript_id` varchar(20) NOT NULL,
`transcript_chrom_start` int(10) unsigned NOT NULL,
`transcript_chrom_end` int(10) unsigned NOT NULL,
PRIMARY KEY (`ensembl_transcript_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
0 hoặc
CREATE TABLE `transcripts` (
`ensembl_transcript_id` varchar(20) NOT NULL,
`transcript_chrom_start` int(10) unsigned NOT NULL,
`transcript_chrom_end` int(10) unsigned NOT NULL,
PRIMARY KEY (`ensembl_transcript_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
2 với
REPLACE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;
0 trong truy vấn con, như thế này:

SELECT column1 FROM t1 WHERE EXISTS (TABLE t2);

Các kết quả giống như khi sử dụng

REPLACE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;
1 mà không có mệnh đề
REPLACE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;
2 trong truy vấn con.


1024

Mới! Lưu câu hỏi hoặc câu trả lời và sắp xếp nội dung yêu thích của bạn. Tìm hiểu thêm.
Learn more.

Tôi bắt đầu bằng cách googling và tìm thấy bài viết cách viết chèn nếu không tồn tại các truy vấn trong SQL tiêu chuẩn nói về các bảng MUTEX.

Tôi có một bàn với ~ 14 triệu hồ sơ. Nếu tôi muốn thêm nhiều dữ liệu theo cùng một định dạng, thì có cách nào để đảm bảo bản ghi tôi muốn chèn chưa tồn tại mà không sử dụng một cặp truy vấn (tức là, một truy vấn để kiểm tra và một để chèn là tập kết quả là tập hợp trống rỗng)?

Liệu một ràng buộc

REPLACE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;
3 trên trường có đảm bảo
REPLACE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;
4 sẽ thất bại nếu nó đã có?

Có vẻ như chỉ với một ràng buộc, khi tôi đưa ra phần chèn qua PHP, tập lệnh swoaks.

Hướng dẫn what is if not exists in mysql? - nếu không tồn tại trong mysql là gì?

Đã hỏi ngày 1 tháng 9 năm 2009 lúc 8:56Sep 1, 2009 at 8:56

Hướng dẫn what is if not exists in mysql? - nếu không tồn tại trong mysql là gì?

12

Sử dụng

REPLACE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;
5.

Ngoài ra còn có cú pháp

REPLACE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;
6 và bạn có thể tìm thấy các giải thích trong lần chèn 13.2.6.2 ... trên câu lệnh cập nhật khóa trùng lặp.


Đăng từ bogdan.org.ua theo webcache của Google:

Ngày 18 tháng 10 năm 2007

Để bắt đầu: Kể từ MYSQL mới nhất, cú pháp được trình bày trong tiêu đề là không thể. Nhưng có một số cách rất dễ dàng để thực hiện những gì được mong đợi bằng cách sử dụng chức năng hiện có.

Có 3 giải pháp có thể: sử dụng chèn bỏ qua, thay thế hoặc chèn vào bản cập nhật khóa trùng lặp.

Hãy tưởng tượng chúng ta có một cái bàn:

CREATE TABLE `transcripts` (
`ensembl_transcript_id` varchar(20) NOT NULL,
`transcript_chrom_start` int(10) unsigned NOT NULL,
`transcript_chrom_end` int(10) unsigned NOT NULL,
PRIMARY KEY (`ensembl_transcript_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Bây giờ hãy tưởng tượng rằng chúng ta có một bản ghi âm đường ống tự động Nhập bảng dữ liệu meta từ OBLEMBL và vì nhiều lý do khác nhau, đường ống có thể bị phá vỡ ở bất kỳ bước thực hiện nào. Vì vậy, chúng ta cần đảm bảo hai điều:

  1. Các lần thực hiện lặp đi lặp lại của đường ống sẽ không phá hủy cơ sở dữ liệu của chúng tôi
  1. Các thực thi lặp đi lặp lại sẽ không chết do ‘trùng lặp> các lỗi khóa chính.

Phương pháp 1: Sử dụng thay thế

Nó rất đơn giản:

REPLACE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;

Nếu hồ sơ tồn tại, nó sẽ bị ghi đè; Nếu nó chưa tồn tại, nó sẽ được tạo ra. Tuy nhiên, sử dụng phương pháp này là hiệu quả cho trường hợp của chúng tôi: chúng tôi không cần phải ghi đè lên các bản ghi hiện có, nó rất tốt chỉ để bỏ qua chúng.

Phương pháp 2: Sử dụng chèn bỏ qua cũng rất đơn giản:

INSERT IGNORE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;

Ở đây, nếu ‘insembl_transcript_id, đã có trong cơ sở dữ liệu, nó sẽ được bỏ qua (bỏ qua). (Để chính xác hơn, đây là một trích dẫn từ hướng dẫn tham khảo MySQL: Nếu bạn sử dụng từ khóa bỏ qua, các lỗi xảy ra trong khi thực hiện câu lệnh chèn được coi là cảnh báo. hoặc giá trị khóa chính trong bảng gây ra lỗi khóa trùng lặp và câu lệnh bị hủy bỏ.) Nếu bản ghi chưa tồn tại, nó sẽ được tạo.

Phương pháp thứ hai này có một số điểm yếu tiềm năng, bao gồm không phá thai của truy vấn trong trường hợp có bất kỳ vấn đề nào khác xảy ra (xem hướng dẫn). Do đó, nó nên được sử dụng nếu được kiểm tra trước đó mà không bỏ qua từ khóa.

Phương pháp 3: Sử dụng chèn vào bản cập nhật khóa trùng lặp:

Tùy chọn thứ ba là sử dụng cú pháp

REPLACE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;
6 và trong phần cập nhật chỉ làm không làm gì một số hoạt động vô nghĩa (trống), như tính toán 0+0 (Geoffray đề nghị thực hiện gán id = id cho công cụ tối ưu hóa MySQL để bỏ qua thao tác này). Ưu điểm của phương pháp này là nó chỉ bỏ qua các sự kiện chính trùng lặp và vẫn hủy bỏ các lỗi khác.

Như một thông báo cuối cùng: Bài đăng này được lấy cảm hứng từ XAPRB. Tôi cũng khuyên nên tham khảo bài đăng khác của mình về việc viết các truy vấn SQL linh hoạt.

Hướng dẫn what is if not exists in mysql? - nếu không tồn tại trong mysql là gì?

Đã trả lời ngày 1 tháng 9 năm 2009 lúc 9:02Sep 1, 2009 at 9:02

Hướng dẫn what is if not exists in mysql? - nếu không tồn tại trong mysql là gì?

KNITTLKNITTLknittl

227K52 Huy hiệu vàng301 Huy hiệu bạc346 Huy hiệu Đồng52 gold badges301 silver badges346 bronze badges

19

Solution:

INSERT INTO `table` (`value1`, `value2`) 
SELECT 'stuff for value1', 'stuff for value2' FROM DUAL 
WHERE NOT EXISTS (SELECT * FROM `table` 
      WHERE `value1`='stuff for value1' AND `value2`='stuff for value2' LIMIT 1) 

Explanation:

Các truy vấn trong cùng

SELECT * FROM `table` 
      WHERE `value1`='stuff for value1' AND `value2`='stuff for value2' LIMIT 1

Được sử dụng làm điều kiện ____ 68 phát hiện nếu đã tồn tại một hàng với dữ liệu sẽ được chèn. Sau khi tìm thấy một hàng của loại này, truy vấn có thể dừng lại, do đó

REPLACE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;
9 (tối ưu hóa vi mô, có thể bị bỏ qua).

Các truy vấn trung gian

SELECT DISTINCT store_type FROM stores
  WHERE EXISTS (SELECT * FROM cities_stores
                WHERE cities_stores.store_type = stores.store_type);
0

đại diện cho các giá trị được chèn.

INSERT IGNORE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;
0 đề cập đến một hàng đặc biệt, một bảng cột có mặt theo mặc định trong tất cả các cơ sở dữ liệu của Oracle (xem https://en.wikipedia.org/wiki/dual_table). Trên phiên bản mysql-server 5.7.26 Tôi có một truy vấn hợp lệ khi bỏ qua
INSERT IGNORE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;
1, nhưng các phiên bản cũ hơn (như 5.5.60) dường như yêu cầu thông tin
INSERT IGNORE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;
2. Bằng cách sử dụng
REPLACE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;
8, truy vấn trung gian trả về một tập kết quả trống nếu truy vấn trong cùng tìm thấy dữ liệu phù hợp.

Truy vấn bên ngoài

SELECT DISTINCT store_type FROM stores
  WHERE EXISTS (SELECT * FROM cities_stores
                WHERE cities_stores.store_type = stores.store_type);
1

chèn dữ liệu, nếu có bất kỳ được trả về bởi truy vấn trung gian.

David

3593 Huy hiệu bạc7 Huy hiệu Đồng3 silver badges7 bronze badges

Đã trả lời ngày 11 tháng 6 năm 2010 lúc 18:38Jun 11, 2010 at 18:38

Máy chủServer

3.0391 Huy hiệu vàng14 Huy hiệu bạc2 Huy hiệu đồng1 gold badge14 silver badges2 bronze badges

11

Trong MySQL, trên bản cập nhật khóa trùng lặp hoặc chèn bỏ qua có thể là các giải pháp khả thi.


Một ví dụ về bản cập nhật khóa trùng lặp dựa trên mysql.com::

SELECT DISTINCT store_type FROM stores
  WHERE EXISTS (SELECT * FROM cities_stores
                WHERE cities_stores.store_type = stores.store_type);
2

Một ví dụ về chèn bỏ qua dựa trên mysql.com

SELECT DISTINCT store_type FROM stores
  WHERE EXISTS (SELECT * FROM cities_stores
                WHERE cities_stores.store_type = stores.store_type);
3

Or:

SELECT DISTINCT store_type FROM stores
  WHERE EXISTS (SELECT * FROM cities_stores
                WHERE cities_stores.store_type = stores.store_type);
4

Or:

SELECT DISTINCT store_type FROM stores
  WHERE EXISTS (SELECT * FROM cities_stores
                WHERE cities_stores.store_type = stores.store_type);
5

Hướng dẫn what is if not exists in mysql? - nếu không tồn tại trong mysql là gì?

Đã trả lời ngày 1 tháng 9 năm 2009 lúc 9:05Sep 1, 2009 at 9:05

ZedzedZed

56K9 Huy hiệu vàng74 Huy hiệu bạc100 Huy hiệu Đồng9 gold badges74 silver badges100 bronze badges

0

Bất kỳ ràng buộc đơn giản nên thực hiện công việc, nếu một ngoại lệ được chấp nhận. Ví dụ:

  • Khóa chính nếu không thay thế
  • ràng buộc duy nhất trên một cột
  • Ràng buộc độc đáo nhiều cột

Xin lỗi nếu điều này có vẻ đơn giản. Tôi biết nó có vẻ tồi tệ đối mặt với liên kết bạn chia sẻ với chúng tôi. ;-(

Nhưng tôi vẫn đưa ra câu trả lời này, bởi vì nó dường như đáp ứng nhu cầu của bạn. (Nếu không, nó có thể kích hoạt bạn cập nhật các yêu cầu của bạn, đó cũng sẽ là "một điều tốt" (TM)).

Nếu một phần chèn sẽ phá vỡ cơ sở dữ liệu ràng buộc duy nhất, một ngoại lệ được ném ở cấp cơ sở dữ liệu, được trình điều khiển chuyển tiếp. Nó chắc chắn sẽ ngăn chặn kịch bản của bạn, với một thất bại. Phải có thể trong PHP để giải quyết trường hợp đó ...

Hướng dẫn what is if not exists in mysql? - nếu không tồn tại trong mysql là gì?

Đã trả lời ngày 1 tháng 9 năm 2009 lúc 9:01Sep 1, 2009 at 9:01

KlekleKLE

23.3K4 Huy hiệu vàng55 Huy hiệu bạc62 Huy hiệu Đồng4 gold badges55 silver badges62 bronze badges

4

Hãy thử những điều sau:

SELECT DISTINCT store_type FROM stores
  WHERE EXISTS (SELECT * FROM cities_stores
                WHERE cities_stores.store_type = stores.store_type);
6

Ren

1.1135 huy hiệu vàng15 Huy hiệu bạc24 Huy hiệu đồng5 gold badges15 silver badges24 bronze badges

Đã trả lời ngày 10 tháng 5 năm 2013 lúc 9:58May 10, 2013 at 9:58

Hướng dẫn what is if not exists in mysql? - nếu không tồn tại trong mysql là gì?

Jeb'sJeb'sJeb's

3682 Huy hiệu bạc10 Huy hiệu đồng2 silver badges10 bronze badges

2

REPLACE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;

Nếu hồ sơ tồn tại, nó sẽ bị ghi đè; Nếu nó chưa tồn tại, nó sẽ được tạo ra.

Đã trả lời ngày 6 tháng 7 năm 2012 lúc 14:35Jul 6, 2012 at 14:35

RociorocioRocio

1791 Huy hiệu bạc2 Huy hiệu đồng1 silver badge2 bronze badges

2

Dưới đây là hàm PHP sẽ chỉ chèn một hàng nếu tất cả các giá trị cột được chỉ định chưa tồn tại trong bảng.

  • Nếu một trong các cột khác nhau, hàng sẽ được thêm vào.

  • Nếu bảng trống, hàng sẽ được thêm vào.

  • Nếu một hàng tồn tại trong đó tất cả các cột được chỉ định có các giá trị được chỉ định, hàng sẽ không được thêm vào.

    SELECT DISTINCT store_type FROM stores
      WHERE EXISTS (SELECT * FROM cities_stores
                    WHERE cities_stores.store_type = stores.store_type);
    8

Ví dụ sử dụng:

SELECT DISTINCT store_type FROM stores
  WHERE EXISTS (SELECT * FROM cities_stores
                WHERE cities_stores.store_type = stores.store_type);
9

Hướng dẫn what is if not exists in mysql? - nếu không tồn tại trong mysql là gì?

Đã trả lời ngày 6 tháng 3 năm 2012 lúc 19:56Mar 6, 2012 at 19:56

JrmjrmJrm

Bạc bạc 2012 Huy hiệu đồng2 silver badges2 bronze badges

4

Có một số câu trả lời bao gồm cách giải quyết vấn đề này nếu bạn có chỉ mục

INSERT IGNORE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;
4 mà bạn có thể kiểm tra với
INSERT IGNORE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;
5 hoặc
INSERT IGNORE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;
6. Điều đó không phải lúc nào cũng đúng và vì
INSERT IGNORE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;
4 có ràng buộc dài (1000 byte), bạn có thể không thể thay đổi điều đó. Ví dụ, tôi đã phải làm việc với siêu dữ liệu trong WordPress (
INSERT IGNORE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;
8).

Cuối cùng tôi đã giải quyết nó bằng hai truy vấn:

SELECT DISTINCT store_type FROM stores
  WHERE NOT EXISTS (SELECT * FROM cities_stores
                    WHERE cities_stores.store_type = stores.store_type);
0

Truy vấn 1 là một truy vấn

INSERT IGNORE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;
9 thông thường mà không có bất kỳ ảnh hưởng nào khi dữ liệu được đặt trong câu hỏi không có ở đó. Truy vấn 2 là
INSERT INTO `table` (`value1`, `value2`) 
SELECT 'stuff for value1', 'stuff for value2' FROM DUAL 
WHERE NOT EXISTS (SELECT * FROM `table` 
      WHERE `value1`='stuff for value1' AND `value2`='stuff for value2' LIMIT 1) 
0 phụ thuộc vào
CREATE TABLE `transcripts` (
`ensembl_transcript_id` varchar(20) NOT NULL,
`transcript_chrom_start` int(10) unsigned NOT NULL,
`transcript_chrom_end` int(10) unsigned NOT NULL,
PRIMARY KEY (`ensembl_transcript_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
2, tức là
INSERT INTO `table` (`value1`, `value2`) 
SELECT 'stuff for value1', 'stuff for value2' FROM DUAL 
WHERE NOT EXISTS (SELECT * FROM `table` 
      WHERE `value1`='stuff for value1' AND `value2`='stuff for value2' LIMIT 1) 
0 chỉ được thực thi khi tập dữ liệu không tồn tại.

Hướng dẫn what is if not exists in mysql? - nếu không tồn tại trong mysql là gì?

Đã trả lời ngày 18 tháng 8 năm 2016 lúc 18:38Aug 18, 2016 at 18:38

Wortwartwortwartwortwart

2.94125 Huy hiệu bạc 30 Huy hiệu Đồng25 silver badges30 bronze badges

1

Một cái gì đó đáng chú ý là việc chèn bỏ qua vẫn sẽ tăng khóa chính cho dù tuyên bố là thành công hay không giống như một phần chèn bình thường.

Điều này sẽ gây ra những khoảng trống trong các khóa chính của bạn có thể khiến một lập trình viên không ổn định về mặt tinh thần. Hoặc nếu ứng dụng của bạn được thiết kế kém và phụ thuộc vào các khóa chính gia tăng hoàn hảo, nó có thể trở thành đau đầu.

Nhìn vào

INSERT INTO `table` (`value1`, `value2`) 
SELECT 'stuff for value1', 'stuff for value2' FROM DUAL 
WHERE NOT EXISTS (SELECT * FROM `table` 
      WHERE `value1`='stuff for value1' AND `value2`='stuff for value2' LIMIT 1) 
3 (cài đặt máy chủ và đi kèm với hiệu suất nhỏ) hoặc sử dụng chọn đầu tiên để đảm bảo truy vấn của bạn sẽ không thất bại (cũng đi kèm với hiệu suất và mã bổ sung).

Đã trả lời ngày 7 tháng 9 năm 2019 lúc 20:53Sep 7, 2019 at 20:53

Hướng dẫn what is if not exists in mysql? - nếu không tồn tại trong mysql là gì?

GillygillyGilly

8.9225 Huy hiệu vàng31 Huy hiệu bạc33 Huy hiệu đồng5 gold badges31 silver badges33 bronze badges

2

Cập nhật hoặc chèn mà không có khóa chính đã biết

Nếu bạn đã có một khóa duy nhất hoặc chính, các câu trả lời khác với

INSERT INTO `table` (`value1`, `value2`) 
SELECT 'stuff for value1', 'stuff for value2' FROM DUAL 
WHERE NOT EXISTS (SELECT * FROM `table` 
      WHERE `value1`='stuff for value1' AND `value2`='stuff for value2' LIMIT 1) 
4 hoặc
INSERT INTO `table` (`value1`, `value2`) 
SELECT 'stuff for value1', 'stuff for value2' FROM DUAL 
WHERE NOT EXISTS (SELECT * FROM `table` 
      WHERE `value1`='stuff for value1' AND `value2`='stuff for value2' LIMIT 1) 
5 sẽ hoạt động tốt (lưu ý thay thế thành xóa nếu tồn tại và sau đó chèn - do đó không cập nhật một phần các giá trị hiện có).

Nhưng nếu bạn có các giá trị cho

INSERT INTO `table` (`value1`, `value2`) 
SELECT 'stuff for value1', 'stuff for value2' FROM DUAL 
WHERE NOT EXISTS (SELECT * FROM `table` 
      WHERE `value1`='stuff for value1' AND `value2`='stuff for value2' LIMIT 1) 
6 và
INSERT INTO `table` (`value1`, `value2`) 
SELECT 'stuff for value1', 'stuff for value2' FROM DUAL 
WHERE NOT EXISTS (SELECT * FROM `table` 
      WHERE `value1`='stuff for value1' AND `value2`='stuff for value2' LIMIT 1) 
7, sự kết hợp được biết là duy nhất. Và bạn muốn cập nhật
INSERT INTO `table` (`value1`, `value2`) 
SELECT 'stuff for value1', 'stuff for value2' FROM DUAL 
WHERE NOT EXISTS (SELECT * FROM `table` 
      WHERE `value1`='stuff for value1' AND `value2`='stuff for value2' LIMIT 1) 
8 nếu tồn tại hoặc chèn nếu không tồn tại. Và bạn muốn làm điều đó chỉ trong một truy vấn (để tránh sử dụng giao dịch). Đây có thể là một giải pháp:

SELECT DISTINCT store_type FROM stores
  WHERE NOT EXISTS (SELECT * FROM cities_stores
                    WHERE cities_stores.store_type = stores.store_type);
1

Về cơ bản, truy vấn thực hiện theo cách này (ít phức tạp hơn so với vẻ ngoài của nó):

  • Chọn một hàng hiện có thông qua đối sánh mệnh đề
    REPLACE INTO `transcripts`
    SET `ensembl_transcript_id` = 'ENSORGT00000000001',
    `transcript_chrom_start` = 12345,
    `transcript_chrom_end` = 12678;
    
    2.
  • Liên kết dẫn đến một hàng mới tiềm năng (Bảng
    SELECT * FROM `table` 
          WHERE `value1`='stuff for value1' AND `value2`='stuff for value2' LIMIT 1
    
    0), trong đó các giá trị cột được đưa ra một cách rõ ràng (s.id là null, do đó nó sẽ tạo ra một định danh tự động tự động mới).
  • Nếu một hàng hiện tại được tìm thấy, thì hàng mới tiềm năng từ Bảng
    SELECT * FROM `table` 
          WHERE `value1`='stuff for value1' AND `value2`='stuff for value2' LIMIT 1
    
    0 sẽ bị loại bỏ (do giới hạn 1 trên bảng
    SELECT * FROM `table` 
          WHERE `value1`='stuff for value1' AND `value2`='stuff for value2' LIMIT 1
    
    2) và nó sẽ luôn kích hoạt một
    INSERT IGNORE INTO `transcripts`
    SET `ensembl_transcript_id` = 'ENSORGT00000000001',
    `transcript_chrom_start` = 12345,
    `transcript_chrom_end` = 12678;
    
    5 sẽ
    INSERT IGNORE INTO `transcripts`
    SET `ensembl_transcript_id` = 'ENSORGT00000000001',
    `transcript_chrom_start` = 12345,
    `transcript_chrom_end` = 12678;
    
    9 cột
    INSERT INTO `table` (`value1`, `value2`) 
    SELECT 'stuff for value1', 'stuff for value2' FROM DUAL 
    WHERE NOT EXISTS (SELECT * FROM `table` 
          WHERE `value1`='stuff for value1' AND `value2`='stuff for value2' LIMIT 1) 
    
    8.
  • Nếu một hàng hiện tại không được tìm thấy, thì hàng mới tiềm năng sẽ được chèn (như được đưa ra bởi Bảng
    SELECT * FROM `table` 
          WHERE `value1`='stuff for value1' AND `value2`='stuff for value2' LIMIT 1
    
    0).

Lưu ý: Mỗi bảng trong cơ sở dữ liệu quan hệ phải có ít nhất một cột tự động tự động

SELECT * FROM `table` 
      WHERE `value1`='stuff for value1' AND `value2`='stuff for value2' LIMIT 1
7. Nếu bạn không có cái này, hãy thêm nó, ngay cả khi bạn không cần nó từ cái nhìn đầu tiên. Nó chắc chắn là cần thiết cho "mẹo" này.

Đã trả lời ngày 6 tháng 12 năm 2019 lúc 8:26Dec 6, 2019 at 8:26

Hướng dẫn what is if not exists in mysql? - nếu không tồn tại trong mysql là gì?

YetiyetiYeti

2.5472 Huy hiệu vàng30 Huy hiệu bạc36 Huy hiệu Đồng2 gold badges30 silver badges36 bronze badges

2

SELECT DISTINCT store_type FROM stores
  WHERE NOT EXISTS (SELECT * FROM cities_stores
                    WHERE cities_stores.store_type = stores.store_type);
2

Đã trả lời ngày 21 tháng 2 lúc 17:15Feb 21 at 17:15

2

Nếu không tồn tại làm gì trong SQL?

Không tồn tại trong SQL Server sẽ kiểm tra trình điều khiển con cho sự tồn tại của hàng. Nếu không có hàng thì nó sẽ trả về đúng, nếu không thì sai. Máy chủ SQL không tồn tại toán tử sẽ trả về các kết quả hoàn toàn ngược lại với kết quả được trả về bởi trình điều khiển con.check the Subquery for rows existence. If there are no rows then it will return TRUE, otherwise FALSE. SQL Server Not EXISTS operator will return the results exactly opposite to the result returned by the Subquery.

MySQL trở lại điều gì nếu không tồn tại?

Nói cách khác, việc không tồn tại trả về đúng nếu trình điều khiển con không có hàng, nếu không nó sẽ trả về sai. Lưu ý rằng bạn có thể sử dụng SELOCT *, chọn cột, chọn A_Constant hoặc bất cứ thứ gì trong Trình quản lý con. Các kết quả giống nhau vì MySQL bỏ qua danh sách chọn xuất hiện trong mệnh đề chọn.true if the subquery returns no row, otherwise it returns false. Note that you can use SELECT * , SELECT column , SELECT a_constant , or anything in the subquery. The results are the same because MySQL ignores the select list appeared in the SELECT clause.

Làm thế nào để bạn chèn dữ liệu nếu không tồn tại MySQL?

Làm thế nào để chèn nếu không tồn tại trong MySQL ?..
Sử dụng chèn bỏ qua.Hãy có một truy vấn chèn cơ bản: chèn vào các công ty (id, full_name, địa chỉ, điện thoại_number) giá trị (1, 'Apple', '1 Infinite Loop, Cupertino, California', 18002752273);....
Sử dụng chèn ... trên bản cập nhật khóa trùng lặp.....
Sử dụng thay thế.Chúng ta có thể sử dụng câu lệnh thay thế:.

Tạo bảng là gì nếu không tồn tại?

Mỗi cơ sở dữ liệu tạo nếu không tồn tại câu lệnh được sao chép, cho dù cơ sở dữ liệu đã tồn tại trên nguồn hay không.Tương tự, mỗi bảng tạo nếu không tồn tại câu lệnh mà không có chọn được sao chép, cho dù bảng có tồn tại trên nguồn hay không.every CREATE TABLE IF NOT EXISTS statement without a SELECT is replicated, whether or not the table already exists on the source.