2011-03-07 26 views
8

Tuyên bố chèn của tôi là:Tại sao MS Access 2007 không cho phép chèn hàng, nhưng sau đó cho phép chèn vào lần chèn tiếp theo?

INSERT INTO myTable (inst_id,user_id,app_id,type,accessed_on) 
VALUES (3264,2580,'MyApp','Renew',Now); 

... trong đó tất cả giá trị được định dạng chính xác. Bảng có các trường ở trên và một trường khác, trường khóa tự động gia tăng dài int. Các khóa ngoại là 'inst_id', 'user_id' và 'app_id'.

Tôi nhận được lỗi này từ Access: access error

... và các lỗi sau từ VS 2005 khi nó lỗi ra:

System.Data.OleDb.OleDbException: Những thay đổi mà bạn yêu cầu vào bảng không thành công vì chúng sẽ tạo các giá trị trùng lặp trong chỉ mục, khóa chính hoặc mối quan hệ. Thay đổi dữ liệu trong trường hoặc trường mà chứa dữ liệu trùng lặp, xóa chỉ mục hoặc xác định lại chỉ mục để cho phép mục trùng lặp và thử lại.

Khi thực hiện truy vấn chèn này, tôi có thể xem xét cơ sở dữ liệu và xem từng giá trị khóa ngoại trong bảng tương ứng và đã trong nhiều tháng (cho ví dụ cụ thể tôi đang sử dụng). Các trường này cũng được đặt để tôi có thể có bản sao, vì vậy đó không phải là vấn đề. Các cuộc gọi có tính chất này trong các bảng khác hoạt động tốt. Tôi không cần phải cung cấp giá trị khóa tự động gia tăng trong truy vấn chèn, nó tự động thêm nó cho tôi (giống như nó nên).

Điều kỳ lạ là nếu tôi làm điều này trong mã của tôi:

try 
{ 
    //Execute the query here... 
} 
catch 
{ 
    //Execute the same query again 
} 

... hoặc nếu tôi chỉ cần cố gắng và thực hiện điều này trong Access hai lần, nó hoạt động.

Có ai đã từng gặp điều này trước đây không? Một lần nữa, kiểu chèn này hoạt động cho các bảng khác, tất cả các khoá ngoại đều có trong các bảng tương ứng, khóa chính của bảng này được đặt là 'Tự động tăng' và tất cả các trường (ngoài trường khóa chính) đặt để cho phép trùng lặp.

Bất kỳ ý tưởng nào?

EDIT: Khóa lớn nhất trước khi chèn: 343085. Khóa lớn nhất sau khi chèn: 343086. Định dạng là:

id: AutoNumber (Field Size=Long Interger, New Values=Increment, Indexed=Yes - No Duplicates) 

inst_id: Number (Field Size=Long Interger, Required=Yes, Indexed=Yes - Duplicates OK) 

user_id: Number (Field Size=Long Interger, Required=Yes, Indexed=Yes - Duplicates OK) 

app_id: Text (Field Size=255, Required=Yes, Indexed=Yes - Duplicates OK) 

type: Text (Field Size=50, Required=Yes, Indexed=No) 

accessed_on: Date/Time (Default Value=Now(), Required=Yes, Indexed=No) 
+0

Để làm cho liên kết dễ đọc, bạn nên sử dụng đánh dấu SO không phải html để hiển thị liên kết, v.v. – Mark

+0

Tôi không biết về Access cụ thể, nhưng điều này có thể xảy ra trong một số cơ sở dữ liệu nếu bạn có trình kích hoạt chèn hàng bổ sung mỗi chèn với một giá trị rõ ràng cho phím tăng tự động. Điều tra các khả năng như vậy, và đăng cấu trúc của bảng cùng với bất cứ điều gì có liên quan, và chọn khóa chính lớn nhất trước khi chèn và sau khi chèn và dán chúng ở đây quá. –

+0

Điều gì sẽ xảy ra đối với các vụ hành quyết thứ ba/thứ tư? Nó chỉ là lần thực hiện đầu tiên thất bại hay nó là lần thứ hai? – Whatsit

Trả lời

1

Đi theo một số ký ức cũ ở đây ...

Hãy thử đặt một trường timestamp trong bảng.

Tôi không thể nhớ chính xác lý do tại sao hoạt động - một số việc cần làm với Access gặp khó khăn khi xác định hồ sơ/có thể là một số loại khóa hoặc lập chỉ mục quirk. Tôi đã làm một số nghiên cứu về điều đó vài năm trước khi nó xảy ra với một trong các bảng của tôi.

Lỗi vi phạm chính đề cập đến không phải là thiếu thiếu khóa trong bảng khác, đó là khóa trùng lặp trong cùng một bảng. Đôi khi, Access nhận được các đường dây của nó bị vượt qua và nghĩ rằng khóa mà nó gán cho bản ghi mới đã được gán cho một bản ghi khác trong bảng. Tôi không biết điều gì sẽ xảy ra. Nhưng bằng cách đặt một trường dấu thời gian trong bảng, nó làm cho Access suy nghĩ khác đi.

Đó là một sửa chữa bực bội, bởi vì tôi không biết tại sao nó hoạt động. Và bây giờ tôi có một dấu thời gian vô dụng trong bảng của tôi. Nhưng cũng vậy.

+0

TimeStamps thường chỉ có liên quan để chỉnh sửa dữ liệu trong biểu mẫu bị ràng buộc trong Access, vì điều đó cho phép Access làm mới dữ liệu được hiển thị nếu người dùng khác cập nhật. PK và Dấu thời gian là rất cần thiết để nó hoạt động trơn tru, và tôi thêm một trường dấu thời gian trong mỗi bảng SQL Server giống như một vấn đề của khóa học. Và SQL Server Migration Assistant cho Access thực hiện điều tương tự, tức là, khi nó upsizes bảng dữ liệu Access của bạn, nó thêm một trường dấu thời gian cho tất cả chúng trong phiên bản SQL Server. –

+0

Dấu thời gian có liên quan đến tạo khóa. Không phải là trường hợp, nhưng nó đã buộc truy cập để ngừng tạo ra các lỗi vi phạm chính. Theo kinh nghiệm tôi có liên quan trong câu trả lời của tôi, nó không liên quan gì đến hình thức bị ràng buộc. – Chains

+0

Tôi không bao giờ thực sự có cơ hội để kiểm tra sửa chữa tem thời gian, nhưng tôi đã chạy vào vấn đề này sau này trong một DB khác. Chấp nhận câu trả lời của bạn bởi vì bạn đã đề cập đến việc truy cập 'nhận được dây của nó đã vượt qua'. Dường như chính xác những gì đang xảy ra ở đây. Việc nén và sửa chữa DB cũng hoạt động để khắc phục sự cố này. –

0

Là giá trị Bây giờ thay đổi giữa những nỗ lực để bây giờ có không còn là một lỗi khóa trùng lặp?

0

INSERT INTO myTable (inst_id, user_id, app_id, type, accessible_on) GIÁ TRỊ (3264,2580, 'MyApp', 'Gia hạn', Bây giờ);


Bạn có thể chỉ cần kiểm tra này ra với accessed_on datatype và Bây giờ datatype



Thay đổi kiểu giá trị của DateTime để String trong khi chèn sẽ được tốt.
Hãy cho tôi biết nếu điều này phù hợp với bạn.

Cảm ơn
rAfee

+0

Điểm đề xuất của việc thay đổi ngày thành chuỗi để chèn là gì? Điều đó có nghĩa là bạn không nhận được xác thực các giá trị. Ngoài ra, bạn đang chuyển hàm Now() cho Jet/ACE để xử lý. Tôi không hoàn toàn chắc chắn rằng Jet/ACE đối xử như thế nào nếu truy vấn mất nhiều thời gian. Liệu nó có được đánh giá một lần để tất cả các bản ghi nhận được cùng một giá trị ngày/giờ? Hay nó được đánh giá theo từng hàng để chúng không giống nhau? Tôi muốn đề nghị nhận giá trị và ghép giá trị bằng chữ để gửi cho Jet/ACE để chèn. –

+0

Trong mọi trường hợp, cột access_on trong câu lệnh chèn là không cần thiết vì có một mặc định trong cơ sở dữ liệu. – Tim

0

Tôi tin Jet/ACE sẽ không hiểu được phương pháp NOW().

Và tôi đã làm việc với phiên bản ACE, cú pháp không thể hoạt động. Cần phải tìm cách khác để thực hiện cú pháp trực tiếp.

+0

@Tim chỉ ra trong một chú thích rằng Now() là giá trị mặc định trên trường, do đó trường đó có thể được hoàn toàn bỏ qua từ câu lệnh SQL. –

0

Tôi biết thời gian dài trước đây tôi gặp vấn đề về similuar. Trong trường hợp của tôi, tôi đã nhận được lỗi tương tự nhưng tôi không có bất kỳ chỉ mục duy nhất nào trong bảng. Cuối cùng tôi đã giải quyết nó bằng cách sửa chữa và nén cơ sở dữ liệu.

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