数据库设计 - 标记字段

时间:2017-08-16 08:40:38

标签: sql-server database database-design

我有一个属性A,因此有一个与A:

相关的表
ID  Name   OtherFields  isPrimary
1   foo      stuff          1
2   bar      stuff          0
3   blah     stuff          0
4   blahh    stuff          0

isPrimary列将行标记为主要行。只有一行可以是主行,并且必须始终将行设置为主

在数据库级别强制执行此操作的最佳方法是什么?

最好的方法是创建一个名为Primary的新表,它有一列,ID是引用A.ID的外键吗?

或者,使用上面列出的表结构,我知道我们可以使用唯一索引强制执行不超过一行设置为1,但是我不确定如何强制执行必须设置不少于一行1

我正在使用MS SQL Server

2 个答案:

答案 0 :(得分:0)

您可以使用“检查”

public class TrayNotification {

    public static void execute(String firstName, String incidentNumber, String requestId, TableView tabTable) throws AWTException, MalformedURLException {
        if (SystemTray.isSupported()) {
            TrayNotification trayNotification = new TrayNotification();
            trayNotification.displayTray(firstName, incidentNumber, requestId, tabTable);
        }
    }

    private void displayTray(String firstName, String incidentNumber, String requestId, TableView tabTable) throws AWTException, MalformedURLException {
        // Obtain a single instance of SystemTray
        SystemTray tray = SystemTray.getSystemTray();

        // Set TrayIcon values
        Image image = Toolkit.getDefaultToolkit().createImage(getClass().getResource("/images/tray-icon.png"));
        final TrayIcon trayIcon = new TrayIcon(image, "Remedy React Notification");
        trayIcon.setImageAutoSize(true);
        trayIcon.setToolTip(incidentNumber);

        // Add TrayIcon to SystemTray instance if possible
        try {
            tray.add(trayIcon);
        } catch (AWTException e) {
            // System.out.println("Notification could not be added.");
        }

        trayIcon.addActionListener(e -> {
            Parent root = null;
            try {
                root = FXMLLoader.load(getClass().getResource("/fxml/scene.fxml"));
                root.requestLayout();
            } catch (IOException e1) {
                e1.printStackTrace();
            }
            System.out.println("Test");
        });

        // Display TrayIcon 
            trayIcon.displayMessage("Hey, " + firstName, "You are now tracking " + incidentNumber + " !", TrayIcon.MessageType.INFO);

    }

}

和IsValid()之类的......

CHECK (IsValid(isPrimary) = 'True')

因此,在所有行的IsPrimary为0之前,它不能插入IsPrimary为0的新行。

答案 1 :(得分:0)

我会创建一个新表。我建议你不要把它称为PRIMARY,因为这是一个保留字。您还应该包含约束以确保它不会有多行。例如:

CREATE TABLE prm
  (id INTEGER NOT NULL REFERENCES TableA (id),
   IsPrimary BIT NOT NULL
   DEFAULT (1)
   CHECK (IsPrimary=1) UNIQUE);