[SQLCE 4] Impossibile inserire un valore duplicato in un indice univoc...

venerdì 08 luglio 2011 - 11.05
Tag Elenco Tags  C#  |  .NET 4.0  |  Windows 7  |  SQL Server Express

utente Profilo | Junior Member

Premettendo che le mie tabelle hanno un campo identità dal nome "id",
quando provo a fare l' INSERT dentro alle tabelle il sistema di dice
Impossibile inserire un valore duplicato in un indice univoco.
Le ho provete tutte tranne una (che è quella giusta).
La mia INSERT è semplice
INSERT INTO tabella (campo1, campo2) VALUES ('ciao','miao')

ho provato anche ad inserire il campo id in questa maniera
INSERT INTO tabella (id, campo1, campo2) VALUES (,'ciao','miao') INSERT INTO tabella (id, campo1, campo2) VALUES (null,'ciao','miao') INSERT INTO tabella (id, campo1, campo2) VALUES ('','ciao','miao')

ma niente, giustamente se specifico il campo id mi dice che quel campo non è modificabile

Come posso risolvere?

----------------------------------------------------------------------------------------------------------------------
Aggiornamenti:

dal seguente indirizzo http://207.46.16.252/it-it/library/ms171879%28SQL.110%29.aspx
si può leggere
[quote]Importante

Se si verificano errori con prefisso "Errore interno" durante l'utilizzo di SQL Server Compact, tentare nuovamente l'operazione, poiché l'errore potrebbe non ripetersi. Se l'errore persiste, contattare immediatamente il Servizio Supporto Tecnico Clienti Microsoft. Gli errori interni non possono infatti essere risolti con le normali tecniche di risoluzione dei problemi.[/quote]

Ma è semplicemente assurdo che un DB si pianti per una chiave incrementale. Spero di sbagliarmi. Voi cosa ne dite?

renarig Profilo | Expert

Premesso che non ho mai usato SQL CE

_________________________________________________

Se è un campo Id non puoi inserire duplicati
Non puoi inserire valori null
__________________________________________________

Non ci hai detto se è un campo autoincrementale,

Prova con
INSERT INTO tabella (campo1, campo2) VALUES ('ciao','miao')

se è autoincrementale il numero se lo crea da se

___________________________________________________

Se invece non è autoincrementale prova con:

INSERT INTO tabella (id, campo1, campo2) VALUES (888888,'ciao','miao')
se è numerico

oppure con
INSERT INTO tabella (id, campo1, campo2) VALUES ('888888','ciao','miao')
se è formato testo

________________________________________________________

A casa fra i miei appunti ho anche la " Formula Magica "
per forzare l'inserimento di un numero specifico in un
campo Id autoincrementale,
Ma potro passrtela questa sera

utente Profilo | Junior Member

Si, si il campo è autoincrementale.
Ho già provato a forzare l'id ma ovviamente e giustamente non va.
Nella ricerca della soluzione del problema ho trovato come forzare l'id (in pratica disabiliti l'autoincremento inserisci l'id e riattivi l'autoincremento) ma questa cosa non mi piace.
Dovrebbe essere una cosa del genere (ma non l'ho nemmeno provata)
SET IDENTITY_INSERT testTable ON; Insert into testTable (id,name) values (1,'Something'); SET IDENTITY_INSERT testTable OFF;
Il database deve essere affidabile e come posso io fidarmi se dopo 5 inserimenti si danneggia?

renarig Profilo | Expert

Forse non ho capito bene il problema.
Tu hai una tabella con Id autoincrementale e vuoi aggiungere un record.
Hai 2 possibilita:
_____________________________________________________________________________________________

___1 Possibilita) Forzare L' Id a un valore che preferisci

_______ Che sia un numero
_______ Che non sia Null
_______ Che non sia gia esistente
( Sopra leggo che parli di errori per valori Null o duplicati )

Per forzare l' Id DEVI necessariamente disattivare temporaneamente
l' autoincremento per poi riattivarlo

Io con SQLServer2008R2 faccio cosi:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Dove:
____ [dbo].[Cl] ___ è la tabella
_______ [ClId] _______ è la Key dove voglio inserire un 7854
_______ [Clente] _____ è il nome del cliente dove voglio inserire 'Romolo'
_______ [ClVia] ______ è la via dove voglio inserire 'Via Roma'
_______ [ClCit] _______ è la citta dove voglio inserire 'Mantova'
________________________________________________________________________________________________

___2 Possibilita) NON forzare l' Id

Le cose cosi sono piu semplici e ti ritrovi un numero incrementale deciso da SQL

Il codice di esempio sopra si riduce a:
INSERT [dbo].[Cl] ([Clente], [ClVia], [ClCit]) VALUES (N'Romolox', N'Via Romax', N'Mantovax')
_____________________________________________________________________________________________

Quanto sopra lo ho testato con SQL2008R2 ( Io non ho la versione CE )
ma penso che funziona anche con la tua versione.

Magari x la tabella non devi scrivere [dbo].[Cl] bensi solo [Cl]


NB: Quegli esempi di codice che hai messo te ( INSERT INTO ) mi ricordano MySql !!!
Ma ti ripeto Non conosco SQL CE









utente Profilo | Junior Member

Come al solito mi spiego male e divento criptico
Io cerco di fare le insert senza forzare l'ID (se ho un campo autoincrementale deve farlo lui non devo pensarci io).
Infatti nella prima insert che ho scritto non forzo minimamente il campo; quelle successive sono solo delle prove che ho fatto e che ho condiviso con voi.
Rimango dell'idea che sia sbagliato forzare l'id se questo viene gestito automaticamente dalla tabella.

Per quanto riguarda il tuo ricordare Mysql è assolutamente vero! Infatti vengo da quella scuola, ma comunque essendo sql standard viene riconosciuto anche da MS SQL. (se sbaglio su questo correggetemi perchè avere una falsa certezza è un male!)
Come ho scritto negli aggiornamenti del primo post, alla fine sembra essere un "Errore interno" del motore e quelli di Microsoft come soluzione propongono quella di contattarli
Non penso ci siano altre alternative, quindi dato che voglio stare un pelo più tranquillo sono passato a SQLite.

danielerew Profilo | Newbie

hai spuntato l opzione not null per il campo id autoincrementante che credo sara di tipo int teoricamente.

INSERT INTO [progetto1].[dbo].[utenti]([nome],[cognome],[note]) VALUES('nome','cognome','note');

e il primo campo è di tipo id autoincrementante e non appare nell insert

ciao
Daniele
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5