Một chuỗi là một đối tượng cơ sở dữ liệu riêng biệt trong Oracle.
Trong MySQL, khi bạn có một cột autoincrement và bạn INSERT một hàng mới trong một bảng, bạn chỉ đơn giản là không đề cập đến cột autoincrement và MySQL đặt nó ở đó. Sau đó, bạn có thể chèn cùng một số vào một bảng khác bằng cách tham chiếu LAST_INSERT_ID()
.
INSERT INTO person (name, date) /*MySQL*/
VALUES ('joe', '2015-01-01');
INSERT INTO contact (person_id, phone)
VALUES (LAST_INSERT_ID(), '555-1212');
Trong Oracle, bạn có thể điền cột id bằng cách đề cập đến thuộc tính .nextval
của đối tượng chuỗi. Bạn có thể nhận được giá trị chỉ được sử dụng của chuỗi đó bằng cách tham chiếu thuộc tính .currval
của nó.
INSERT INTO person (id, name, date) -- Oracle
VALUES (person_seq.nextval, 'joe', '2015-01-01');
INSERT INTO contact (id, person_id, phone)
VALUES (contact_seq.nextval, person_seq.currval, '555-1212');
Mỗi lần bạn đề cập đến thuộc tính .nextval
của chuỗi, nó được đảm bảo cung cấp số mới.
Đối tượng chuỗi khá thú vị khi bạn cần các số duy nhất không liên quan trực tiếp đến khóa chính của một số bảng hoặc khác. Bạn có thể làm điều này trong MySQL, nhưng đó là một kludge: Nếu bạn tạo bảng sau:
CREATE TABLE sequence ( /*MySQL*/
sequence_id BIGINT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`sequence_id`)
)
Sau đó ban hành các truy vấn này một ba sau khi khác:
INSERT INTO sequence() VALUES(); /*MySQL*/
DELETE FROM sequence WHERE sequence_id < LAST_INSERT_ID();
SELECT LAST_INSERT_ID() AS sequence;
Các truy vấn thứ ba là bảo đảm để quay trở lại một số thứ tự duy nhất. Bảo đảm này giữ ngay cả khi bạn có hàng tá chương trình khách khác nhau được kết nối với cơ sở dữ liệu của bạn. (Truy vấn DELETE
chỉ giữ bảng khác vô nghĩa này từ chiếm quá nhiều không gian.)
Với Oracle, bạn tạo chuỗi
create sequence seq --Oracle
và sau đó chỉ cần làm
SELECT seq.nextval FROM DUAL --Oracle
để có được một số thứ tự mới và đó là nó. Nó cũng đảm bảo tính duy nhất ngay cả với hàng chục chương trình khách hàng được kết nối.
Tương tự, nếu bạn cần giá trị của chuỗi bạn vừa tạo với .nextval
, bạn có thể phát lệnh này và nhận lệnh.
SELECT seq.currval FROM DUAL --Oracle
Giống như với LAST_INSERT_ID()
của MySQL, điều này được xử lý theo phiên để khách hàng khác sử dụng chuỗi sẽ không làm cho bạn nhận được số của họ thay vì số của bạn.
Dòng dưới cùng: cả hai DBMS đều có thể tạo số nguyên duy nhất.Tính toàn vẹn của cả hai lược đồ được thiết kế để được bảo toàn qua các điểm dừng máy chủ và khởi động lại. Trình tự Oracle linh hoạt hơn.
Một chuỗi giống như một quy tắc hơn là cột khóa chính – Mihai
Nhanh chóng: Có một số * rất * sự khác biệt đáng kể: AUTO_INCREMENT được gắn với một cột trong một bảng duy nhất, chỉ một bảng cho mỗi bảng. Oracle SEQUENCE thì không. Khi khởi động lại cơ sở dữ liệu, đối với bảng InnoDB, AUTO_INCREMENT được đặt lại thành giá trị cột cao nhất. Oracle SEQUENCE thì không. Một đối tượng Oracle SEQUENCE là một đối tượng hoàn toàn riêng biệt, được thiết kế để tạo ra các giá trị duy nhất, với sự tranh chấp thấp/đồng thời cao. (Đúng là chúng ta có thể mô phỏng MySQL AUTO_INCREMENT bằng SEQUENCE và BEFORE INSERT trigger, nhưng "vào cuối ngày", Oracle SEQUENCE ít giống với AUTO_INCREMENT. – spencer7593
Nếu câu hỏi là: "Chúng ta có thể mô phỏng kiểu AUTO_INCREMENT kiểu MySQL trong Oracle Nếu câu hỏi là về sự khác biệt ... Trình tự Oracle: có thể có giới hạn dưới và trên, có thể có giá trị âm cho tăng, có thể bọc (sau khi đạt đến giới hạn trên, bắt đầu lại mức quy định thấp hơn ràng buộc), các giá trị mới có thể được lấy ra bằng câu lệnh SELECT, không yêu cầu INSERT, một chuỗi đơn có thể được sử dụng bởi vô số các trigger, hàm, thủ tục khác nhau, có thể bị xóa/tái tạo độc lập với bất kỳ bảng nào; giữ lại trên cơ sở dữ liệu khởi động lại, vv – spencer7593