首页 > 解决方案 > MySQL 将或不会返回重复行,具体取决于特定列是否存在。为什么?

问题描述

我正在使用 Spring Tool Suite 版本:3.9.8.RELEASE 使用扩展 CRUD MySQL 表的存储库导入 CSV 文件。

我最初遇到的问题是,由于某些原因,“名称”列下的值被重复,并且在从数据库中获取时,许多值都丢失了。

经过大量测试后,我意识到“名称”下的值被重复(意味着多个值将具有相同的名称),但它们也替换了数据库中的其他“名称”值(那些缺失的值)。

我去掉了“间隔”列,它解决了这个问题,这意味着所有的值都被返回了,没有一个丢失,也没有重复。我认为发生的事情是 MySQL 以某种方式通过“间隔”列中的内容,因为某些间隔是重复的(例如 10:00-10:30 可能出现多次,但与不同的 Name 值有关)

我的问题是为什么会这样?是因为“间隔”列的格式吗?(它是 varchar(255) 但它写为“00:00-00:00”

@Controller
public class Patterns {

        @Autowired
        private PatternRepository repo;


        @RequestMapping("")
        public String index() {
            return "index";
        }

        @RequestMapping("searchAll")
        public ModelAndView patterns() {

            ModelAndView mv = new ModelAndView("showinfo");


             ArrayList<Pattern> pattern =   (ArrayList<Pattern>) repo.findAll(); 



            mv.addObject("pattern", pattern);


            return mv;
        }


@Entity
public class Pattern {


    @Id
    @GeneratedValue

    public String Intervals;

    public String Name;

    public String Code;

    public String Duration;

    public Long Id;



<h1>show info</h1>
    <fieldset>
        <legend>All Agent Activity</legend>
            <table border="1" cellpadding="5">
                <tr>
                    <th>Intervals</th>
                    <th>Name</th>
                    <th>Code</th>
                    <th>Duration</th>
                </tr>
                <c:forEach items="${pattern}" var = "i" >

                    <tr>
                        <td>${ i.intervals }</td>
                        <td>${ i.name }</td>
                        <td>${ i.code }</td>
                        <td>${ i.duration }</td>
                    </tr>

                </c:forEach>
            </table>
    </fieldset>

MySQL 表

标签: javamysqlspring-boot

解决方案


你写了:

  @Entity
  public class Pattern {


      @Id
      @GeneratedValue

      public String Intervals;

      public String Name;

这意味着主键是“间隔”,而不是名称。因此,对“名称”属性没有特别限制(至少在 java 代码中),因此可能存在重复。

如果您希望“Name”作为主键,请移至@Id声明之前的行Name。但是您有一个名为 的属性Id,并且您可能将其作为主键。为了使事情更容易,您可能还希望自动生成此属性,将两者都移动@Id@GeneratedValue声明之前Id

例子:

  @Entity
  public class Pattern {

      public String intervals;

      public String name;

      @Id
      @GeneratedValue
      public Long id;

PS:请使用java命名约定:驼峰式的属性:小写的第一个字符(name,不是Name


推荐阅读