CREATE TABLE M_NAMES (
ID         INT IDENTITY(1, 1),       --ID
CLASS_CD TINYINT NOT NULL,         --暘椶
NAME_CD SMALLINT NOT NULL,        --嬫暘
FULL_NAME NVARCHAR(60),             --柤徧
SHORT_NM1 NVARCHAR(10),             --棯徧1
SHORT_NM2 NVARCHAR(20),             --棯徧2
REMARK1 NVARCHAR(40),             --旛峫1
REMARK2 NVARCHAR(40),             --旛峫2
DIV1 NVARCHAR(2),              --嬫暘1
DIV2 NVARCHAR(3),              --嬫暘2
DIV3 NVARCHAR(4),              --嬫暘3
INS_DATE DATETIME,                 --搊榐擔
UPD_DATE DATETIME,                 --峏怴擔
VERSION INT NOT NULL,             --僶乕僕儑儞 CONSTRAINT PK_NAMES PRIMARY KEY (ID),
CONSTRAINT U_NAMES UNIQUE (CLASS_CD,NAME_CD)
)
CREATE INDEX INDEX_NAME ON M_NAMES(CLASS_CD,NAME_CD)
时候报错 :违反主键的PK_NAMES的约束。对象' dbo.M_NAMES “你不能插入重复键。
我是重tet文件里读出一条记录插入数据库的。怎么样修改者张表才能正确把数据正确的插入数据库啊。

解决方案 »

  1.   

    你这张表的ID,已经是自增序列了,正常操作是不会出现主键重复的。说明你所导入的text文件中的记录,其ID,跟数据库中已有表数据的ID存在重复。这种情况下,如果你不能把数据库中现有记录清空的话(也就是说你并不是在做一个恢复操作),那么你就只能是修改text文件中记录的ID序列号,常用的做法是固定增加一个很大的数。比如固定增加 80000000:
    text文件中ID是 123,那么你写数据库时,ID就改为:80000123
      

  2.   


    public class DataTest {
    BufferedReader br = null;
    Connection conn = null;
    PreparedStatement pstmt=null;

    public static void main(String []args){
    new DataTest().test("filepath");

    }
    public void test(String filePath){

    try {

    conn = ImportData.getConnection();
    String sql = "insert into M_NAMES vlaues(?,?,?,?,?,?,?,?,?)";
    pstmt = ImportData.prestmt(conn, sql);
    br=new BufferedReader(new FileReader(filePath));
    String str = br.readLine();
    String s[] = str.split(",");
    int i = 0 ;

    while(str!=null){
    ++i;
    pstmt.setString(1, s[0]);
    pstmt.setString(2, s[1]);
    pstmt.setString(3, s[2]);
    pstmt.setString(4, s[3]);
    pstmt.setString(5, s[4]);
    pstmt.setString(6, s[5]);
    pstmt.setString(7, s[6]);
    pstmt.setString(8, s[7]); 
    pstmt.setString(9, s[8]);
    pstmt.setString(10, s[9]);

    pstmt.addBatch();

    if(i==100){
    i=0;
    pstmt.executeBatch();
    conn.commit();
    }
    str = br.readLine();
    }
    if(i>0){
    pstmt.executeBatch();
    conn.commit();
    }

    } catch (FileNotFoundException e) {
    e.printStackTrace();
    }catch (IOException e) {
    e.printStackTrace();
    }catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }finally{
    try {
    br.close();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    ImportData.close(conn, pstmt, null);
    }


    }

    }
    JAVA  代码应该没有错吧。
      

  3.   

    如果只是要把数据导入,不需要延续ID的话,ID字段插NULL。
    Java代码没啥,但SQL有问题,这种Insert写法会完全不清楚字段是怎么匹配而引发各种灵异问题,所以把字段名全部列出来,顺序注意保持跟参数的一致:String sql = "insert into M_NAMES(CLASS_CD, NAME_CD, ......) vlaues(?,?,?,?,?,?,?,?,?)";
      

  4.   

    楼主可以修改你的txt文件,插入的时候不要插ID这个字段。ID就不会出现重复的错误了。
    ID反正也是自增的。但这样要考虑下,与这个表相关的表是否与这个ID有关联的数据或者外键
      

  5.   

    java代码是应该没有问题的,但在debug的时候,发现while里面的数值还是第一条的类容,所以把 String s[] = str.split(","); 放到了while里面。就这样也要去掉id自动递增的属性的。
     
      

  6.   

    ID                INT IDENTITY(1, 1),       --ID
    修改id属性  改成否 如图
      

  7.   

    1.insert into M_NAMES(CLASS_CD, NAME_CD, ......)  vlaues(?,?,?,?,?,?,?,?,?)";
    按照M_NAMES 表结构应该是13列。不算 ID 2.DATETIME类型,null的时候,用setString,有点问题。最好用setNull
      

  8.   


    楼主啊,我说了SQL有问题,你还是修改下吧
      

  9.   

    我想知道怎么把id字段的自增长去掉。求一条sql语句啊。
    还有去了过后怎么在加这个自增长添加上去。
      

  10.   

    不用删除这个自增了,Insert语句里面不要带有 ID 字段即可。
      

  11.   


    1.你如果想直接插入可以采用 
    SET   IDENTITY_INSERT   yourtablename   ON 
    go 
    2.关闭
    SET   IDENTITY_INSERT   yourtablename   OFF
    go