2009-03-04 33 views
9

Nói rằng tôi có bảng sau:Làm thế nào để ngăn chặn bội số của 13 xuất hiện trong một cột IDENTITY

Create Table Comments (
    ID Int Identity(1,1) Not Null Primary Key Clustered, 
    Comment Text Not Null 
) 

Vì tôi là mê tín dị đoan, làm thế nào tôi có thể ngăn chặn bội số của 13 xuất hiện trong cột ID?
ví dụ: Bỏ qua 13, 26, 39, v.v.

Giải pháp trong MySQL hoặc MSSQL được đánh giá cao.

+0

Bạn không thể nghiêm túc. –

+0

Aww man. Đây có thể là một ví dụ cực đoan về một vấn đề meta, nhưng nó là một câu hỏi thú vị. Có lẽ anh ta đang sử dụng danh tính như một số khách hàng cho một trang web cờ bạc và khách hàng của anh ấy mê tín dị đoan. Mở lại! – JohnFx

+0

+1 mở lại. Tại sao lại đóng nó? Lý do có thể là đặc biệt nhưng nó là một câu hỏi lập trình kỹ thuật hoàn toàn hợp lệ. Nếu bạn đóng này, bạn phải chi tiêu trong 12 giờ tiếp theo đóng mỗi câu hỏi khác có lý do mà bạn không nghĩ là đủ tốt. – Simon

Trả lời

6

Tạo trình kích hoạt để chuyển sang tiếp theo mỗi lần 13n - 1 đi lên trong chuỗi

BradC, đây là dành cho bạn. Nếu không có bất kỳ kiến ​​thức về SQL Server, tôi sẽ làm điều đó trong Oracle. This có vẻ là một tài liệu tham khảo tốt cho trigger trong SQL Server

CREATE OR REPLACE TRIGGER trigname 
    AFTER INSERT ON Comments 
    FOR EACH ROW 
    IF (:new.ID % 13 = 12) THEN 
    -- increase the sequence 
    SELECT comment_ID_sequence.NEXTVAL FROM dual; 
    END IF; 
END; 

Nếu không thực sự thử nghiệm nó, điều này có thể sẽ không làm việc, nhưng với một lượng nhỏ thử và sai, bạn có thể lấy nó làm việc. Oracle có các đối tượng chuỗi không được gắn với bảng nào cả, và bạn có thể bẻ khóa trình tự cả ngày nếu muốn, mà không bao giờ chạm vào bảng. Tôi không biết nếu điều này là đúng trong SQL Server.

+0

Những gì, một kích hoạt chèn? Chăm sóc để cung cấp cho một số chi tiết về những gì mà sẽ như thế nào? – BradC

+0

Cảm ơn câu trả lời :) – GateKiller

+0

Vì vậy ... một 13 trong một kích hoạt là ok? –

0
Create Table Comments ( 
    ID Int Identity(2,2) Not Null Primary Key Clustered,  
    Comment Text Not Null 
) 
+0

Điều đó không có tác dụng .... Mọi bội số khác của 13 đều là. –

+0

Vì vậy, có thể Identity (1,13)? Tâm trí bạn, định nghĩa chứa 13 ... –

+0

Cock. Điều đó sẽ dạy tôi để cố gắng trở nên buồn cười! – ctrlalt3nd

4

Chỉnh sửa: câu trả lời trước đó hoàn toàn sai.

Bạn có thể làm điều đó như thế này:

Identity(1, 13) 

Như thử nghiệm bởi:

for (int i = 1; i < 10000000; i += 13) 
{ 
    if (i % 13 == 0) 
    { 
     Console.WriteLine(i); 
    } 
} 

Tăng dần 13, bắt đầu từ ngày 1 không bao giờ nên cung cấp cho bạn một bội số của 13, ít nhất là cho đến 10 triệu.

+0

Câu trả lời trước của tôi sai/gây nhầm lẫn, vì vậy tôi đã thực hiện một số kiểm tra và nhận ra câu trả lời đơn giản như bắt đầu từ 1 và tăng thêm 13. –

+0

Điều đó không để lại nhiều ID trống? – DevinB

+0

Tất nhiên, và các ID sẽ nhận được khá lớn, tương đối nhanh chóng. Đó là một giải pháp khá đơn giản, tuy nhiên. –

2

Tạo trình kích hoạt khi chèn.

Khi chèn thứ gì đó là bội số của 13 trừ 1 (12, 25, 38, v.v.), hãy chèn và xóa một hàng khác ngay lập tức.

Something như thế (có thể cần phải sửa đổi):

CREATE TRIGGER ON [table_name] 
AFTER INSERT 
AS 
    -- Get the last inserted identifier 
    DECLARE @LastID INT -- or whatever type is your identity column 
    SET @LastID = SELECT ID FROM inserted -- inserted holds the inserted entry 

    -- Check if the ID is a multiple of thirteen minus 1 
    IF ((@LastID + 1) % 13 = 0) -- not sure it would work, but something like that 
    BEGIN 
     INSERT INTO [table_name] 
     -- dummy values 

     DELETE FROM [table_name] WHERE ID = (@LastID + 1) 
    END 

GO 
+0

Tôi không thành thạo trong các trình kích hoạt, nhưng điều đó không tạo ra một điều kiện chủng tộc? –

+0

Đây chính xác là những gì tôi đang nghĩ, và có lẽ là câu trả lời hay nhất. –

+0

@saua: không có nó sẽ không tạo ra một điều kiện chủng tộc bảng bị khóa cho đến khi kích hoạt được thực hiện. –

3

Identity (7919, 4966)

này trở 432'436 ID duy nhất trong một int 32bit và không là một bội số của 13.

Nhiều cặp:

17, 1040 - sản lượng 2'064'889 giá trị

17, 559 - sản lượng 3'841'653 giá trị

[EDIT] Chương trình python nhỏ để kiểm tra:

import sys 

def x(start, step): 
    count = 0 
    i = start 
    N = 1 << 31 
    while i < N: 
     #print i 
     if i % 13 == 0: 
      break 
     i += step 
     count += 1 
    print i, i/13.0, count 

if __name__ == '__main__': 
    x(int(sys.argv[1]), int(sys.argv[2])) 

tôi chỉ sử dụng một vài số nguyên tố nhưng điều đó không thực sự làm việc; với số nguyên tố, tôi chỉ có thể nhận được chuỗi với 1-12 số. Vì vậy, tôi bắt đầu với một cặp ngẫu nhiên và thay đổi số thứ hai cho đến khi kịch bản sẽ dừng lại để trở về.

Tôi không có ý tưởng về các thuộc tính toán học của hai số;) Bất kỳ ai?

+0

Điều này rất thú vị. .. bạn có thể mô tả cách bạn đưa ra những con số đó không? Tôi đang suy nghĩ một số toán học gọn gàng. – Beska

+0

Err ... Tôi bắt đầu với các số nguyên tố <10000 và sau đó viết một chương trình python nhỏ để xác minh xem cái nào là OK;) Tôi là một coder ít hơn và ít toán hơn ... –

+0

Được rồi, bây giờ chúng ta chỉ cần biến nó thành một vấn đề về code-golf .... – JohnFx

Các vấn đề liên quan