MySQL是否会返回重复的行,具体取决于是否存在特定的列。为什么?

时间:2019-06-12 13:15:15

标签: java mysql spring-boot

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

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

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

我摆脱了“间隔”(Intervals)列,它解决了这个问题,这意味着返回了所有值,没有一个丢失,并且没有重复。我认为发生的事情是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 Table

1 个答案:

答案 0 :(得分:1)

您写道:

  @Entity
  public class Pattern {


      @Id
      @GeneratedValue

      public String Intervals;

      public String Name;

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

如果希望“名称”作为主键,请将@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